Без -t
, sshd
получает stdout удаленной оболочки (и дочерних, как sleep
) и stderr через два канала (а также отправляет входные данные клиента через другой канал).
sshd
ожидает процесс, в котором он запустил оболочку входа пользователя, но также и после того, как этот процесс завершился, ожидает eof на канале stdout (по крайней мере, на канале stderr в случае openssh).
И eof происходит, когда файловый дескриптор любого процесса, открытого на конце записи канала, отсутствует, что обычно происходит только тогда, когда все процессы, чей stdout не перенаправлен на что-то другое, пропали.
Когда вы используете -t
, sshd
не использует трубы. Вместо этого все взаимодействие (stdin, stdout, stderr) с удаленной оболочкой и ее дочерними элементами выполняется с использованием одной псевдо-терминальной пары.
С псевдо-терминальной парой для sshd
взаимодействия со стороной мастера нет аналогичной обработки eof или какого-либо способа узнать, существуют ли еще процессы с открытыми fds для ведомой стороны псевдотерминала, поэтому он просто ожидает завершения процесс, в котором он выполнил оболочку входа удаленного пользователя и затем завершил работу.
После этого выхода главная сторона пары pty закрывается, что означает, что pty уничтожен, поэтому процессы, управляемые ведомым, получат SIGHUP (который по умолчанию завершит их).
nohup
чтобы скрипт работал так. (Вы можете также рассмотреть возможность запуска длительных заданий внутри,tmux
чтобы вы могли отслеживать их прогресс в интерактивном режиме, но файл журнала работает нормально.)Используйте
wait
:источник