Я запустил автосервис с временем опроса 30 с:
AUTOSSH_POLL=30 AUTOSSH_LOGLEVEL=7 autossh -M 0 -f -S none -f -N -L localhost:34567:localhost:6543 user1@server1
И он работает нормально:
Sep 5 12:26:44 serverA autossh[20935]: check on child 23084
Sep 5 12:26:44 serverA autossh[20935]: set alarm for 30 secs
Но если я физически отсоединю сетевой кабель, то есть туннель больше не сможет работать, autossh не убьет демон ssh. Зачем? Я понимаю, что autossh ничего не может сделать, если ссылка не работает, но, на мой взгляд, он должен попытаться сделать следующее:
check on child ...
)Вот почему я использую autossh: если что-то случится с туннелем (будь то проблема программного или аппаратного обеспечения), он должен попытаться перезапустить его. Вместо этого он просто ждет смерти процесса ssh. Разве он не должен пытаться перезапустить его, даже если нет никакой надежды на восстановление соединения?
Какую проверку делает автосш? Просто убедитесь, что ssh запущен и работает? Разве он не проверяет дальний конец?
По запросу я добавляю соответствующую часть конфигурации ssh:
# (see http://aaroncrane.co.uk/2008/04/ssh_faster)
# The ServerAliveInterval tells SSH to send a keepalive message every 60 seconds while the connection is open;
# that both helps poor-quality NAT routers understand that the NAT table entry for your connection should
# be kept alive, and helps SSH detect when there’s a network problem between the server and client.
ServerAliveInterval 60
# The ServerAliveCountMax says that after 60 consecutive unanswered keepalive messages, the connection should
# be dropped. At that point, AutoSSH should try to invoke a fresh SSH client. You can tweak those
# specific values if you want, but they seem to work well for me.
ServerAliveCountMax 60
TCPKeepAlive yes
Но если я физически отсоединю сетевой кабель, то есть туннель больше не сможет работать, autossh не убьет демон ssh. Зачем?
autossh работает на вашем клиентском компьютере, поэтому он не может напрямую убить процесс демона ssh на сервере. Однако вы можете указать ненулевое значение для ClientAliveInterval
в /etc/ssh/sshd_config
на сервере (см. man sshd_config
) и перезапустите службу sshd на сервере, чтобы применить изменение конфигурации. Тогда в случае отключения сети процесс демона ssh будет убит после ClientAliveInterval * ClientAliveCountMax
секунд (но не с помощью autossh).
Теперь, если вы хотели спросить "Почему autossh не убивает процесс клиента ssh?", вы указали -M 0
. На странице руководства autossh:
Setting the monitor port to 0 turns the monitoring function off, and autossh will only restart ssh upon ssh's exit
.
Вместо использования autossh для отслеживания соединения вы ждете выхода ssh по истечении тайм-аута. ServerAliveCountInterval * ServerAliveCountMax
секунд. Вы запросили 60 проверок работоспособности сервера перед завершением работы ssh с 60-секундным интервалом между последовательными проверками, поэтому вы будете ждать час, прежде чем ваш клиент ssh завершит работу.
Вам также следует серьезно подумать об использовании ExitOnForwardFailure
опция на стороне клиента (см. man ssh_config
), так что ssh выйдет, если не сможет установить туннель, а затем autossh может попытаться запустить ssh снова.