При попытке установить туннель ssh я заметил, что даже если соединение не удается, процесс остается живым. Например, если я попытаюсь запустить эту команду, пока hostname
не работает:
/usr/bin/ssh -f -i /home/user/.ssh/id_rsa -N -R 3000:localhost:22 user@hostname
Иногда я получаю ответ:
Warning: remote port forwarding failed for listen port 3000
Я получаю это сообщение об ошибке только тогда, когда исходный процесс (запущенный на локальном компьютере) умирает но удаленный сервер еще не осознает. Процесс пытается перезапустить, но сервер думает, что у него все еще есть соединение на 3000 и не будет исключать новое соединение, что приводит к предупреждению выше.
Но если я сделаю pgrep -x ssh
, я увижу, что процесс все еще жив. Я хотел бы запустить эту команду ssh как часть сценария bash в cronjob, который сначала проверяет, установлен ли туннель, и, если не восстанавливает его, но способ настройки сценария: а) видит, что туннель вниз и пытается создать новый (который тайно терпит неудачу), или б) видит, что неудачный процесс жив и ничего не делает. В результате туннель никогда не восстанавливается, пока существует этот неудачный процесс.
Есть ли способ просто убить процесс в случае сбоя соединения вместо получения предупреждения?
Для тех, кто еще может найти ответ, я нашел нужную мне опцию в этом ответе: добавление -o ExitOnForwardFailure=True
к команде заставляет ssh завершать работу, если проброс порта не удался, вместо создания зомби-процесса:
/usr/bin/ssh -f -i /home/user/.ssh/id_rsa -N -R 3000:localhost:22 user@hostname -o ExitOnForwardFailure=True
попробуйте ClientAliveInterval.
man sshd_config
ClientAliveInterval
Sets a timeout interval in seconds after which if no data has been received from the client, sshd(8) will send a message through
the encrypted channel to request a response from the client. The default is 0, indicating that these messages will not be sent
to the client.