15

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

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

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

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

1 ответ1

13

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

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

Опция -t :

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .