Я подключаюсь к удаленному серверу для доступа к частному API. Я использую следующую команду (введя ее в Терминал) для перенаправления одного порта: ssh -L $local_port:$host:$port -v
. Пробовал много разных локальных портов (9000, 9001 и т. Д.).
Я могу без проблем использовать api прямо из браузера или проксировать через nginx в течение нескольких часов. При доступе к нему из приложения playframework сеанс ssh печатает «select: Invalid argument» и закрывает соединение.
Вот как выглядит журнал, когда это происходит:
debug1: channel 1016: free: direct-tcpip: listening port 9001 for ec2-xxx.compute-1.amazonaws.com port 9000, connect from 127.0.0.1 port 65349, nchannels 1
select: Invalid argument
Connection to ec2-xxx.compute-1.amazonaws.com closed.
Transferred: sent 243904, received 64728 bytes, in 87.8 seconds
Bytes per second: sent 2778.0, received 737.2
debug1: Exit status -1
Приложение для воспроизведения использует AsyncHttpClient для выполнения запросов GET localhost: $ local_port.
Есть ли решение этой проблемы со стороны подключения? например заставить ssh игнорировать ошибку и продолжить подключение?
Я только что заметил, что в вашем отладочном сообщении указан канал 1016. Я подозреваю, что у вас заканчиваются файловые дескрипторы. Я только что проверил на своем ноутбуке с Linux, и ulimit -a показывает мне максимум 1024. Итак, я полагаю, вы тоже это делаете. Идеальное решение - выяснить, как вы используете столько одновременных файловых дескрипторов, и как-то уменьшить их.
Альтернативный вариант - просто увеличить максимальное количество открытых файловых дескрипторов:
(useful debug commands here)
lsof -p <pid> should show you the open filedescriptors in use by a process, btw.
ulimit -a should show you your soft limits in this specific shell
ulimit -aH should show you the hard limits in this specific shell
cat /proc/<pid>/limits should show you the limits in effect on a specific process.
Чтобы увеличить пределы fd, вам нужно отредактировать /etc/security/limits.conf на обеих машинах, включив в него следующие строки:
* hard nofile 4096
* soft nofile 4096
root hard nofile 4096
root soft nofile 4096
Эти недавно перенастроенные ограничения вступят в силу только после повторного входа в систему. Я часто использую ssh на localhost, чтобы проверить такие вещи, но на вашем месте я бы перезагрузился, если это возможно.
Если вы не можете перезагрузить удаленную машину, я бы хотя бы перезапустил sshd. Прежде чем снова использовать ssh, используйте ulimit -a, чтобы подтвердить, что максимальное количество открытых файлов или файловых дескрипторов составляет 4096.
Когда вы подключитесь по ssh к удаленному компьютеру, запустите ulimit -n, чтобы убедиться, что он говорит 4096.
Удачи.
Предыдущие ответы, скорее всего, будут правильными, но если увеличение количества дескрипторов файлов не помогает, вы можете проверить свои файлы входа (.bashrc, .bash_profile, .login, / etc / login и т. Д.) На предмет неправильного использования встроенная функция bash "select" - дополнительную информацию см. в man bash.