Почему мой удаленный процесс все еще работает после завершения сеанса SSH?

15

Я подключаю удаленный лог-файл, выполнив эту команду в локальной оболочке:

ssh remotemachine tail -100f /path/to/error_file

Когда я нажимаю ctrl-c из этой команды, кажется, что ctrl-c убивает локальный процесс ssh и оставляет мой хвост запущенным на удаленной машине. У меня сложилось впечатление, что разрыв соединения отправит сигнал зависания (поскольку я не использую nohup) и уничтожит процесс, но это явно не так.

Кто-нибудь может пролить свет на то, когда посылаются сигналы зависания, а когда нет? Удаленная машина - это Ubuntu, а моя локальная оболочка - OS X bash, если что-то из этого имеет значение.

Райан Олсон
источник

Ответы:

13

Такое поведение связано с отсутствием управляющего терминала для запущенного процесса. Когда удаленный процесс не имеет управляющего терминала, удаленный процесс ssh, обрабатывающий ваш сеанс, не может убить команду, которая остается висеть в состоянии зомби и в конечном итоге будет очищена с помощью init.

Вы можете обойти это, запустив его с опцией -t, которая дает ему управляющий терминал. Это приведет к завершению процесса при удаленном выполнении ctrl-c вашей команды ssh.

Опция -t :

Сила псевдо-тты выделения. Это может быть использовано для выполнения произвольных программ на экране на удаленной машине, что может быть очень полезно, например, при реализации сервисов меню. Несколько опций -t заставляют tty выделяться, даже если ssh не имеет локального tty.

Посмотрите на man ssh и man sshd, когда вы используете эту опцию, так как есть другие последствия наличия управляющего терминала, например, возможность отправлять escape-символы.

Нагул
источник