Без -t
, sshd
получает стандартный вывод удаленной оболочки (и дочерние элементы, такие как sleep
) и stderr через два канала ( а также отправляет клиентский ввод через другой канал).
sshd
действительно ждет процесса, в котором он запустил оболочку входа пользователя, но также, после того, как этот процесс завершится, ждет eof на конвейере stdout (не на конвейере stderr, по крайней мере, в случае openssh) .
И eof происходит, когда нет дескриптора файла ни одним процессом, открытым на стороне записи канала, что обычно происходит только тогда, когда все процессы, которые не перенаправили свой стандартный вывод на что-то еще, ушли.
Когда вы используете -t
, sshd
не использует каналы. Вместо этого все взаимодействие (stdin, stdout, stderr) с удаленной оболочкой и ее дочерними элементами выполняется с использованием одной пары псевдотерминалов.
С парой псевдотерминалов для sshd
, взаимодействующего с ведущей стороной, нет аналогичной обработки eof, и хотя по крайней мере некоторые системы предоставляют альтернативные способы узнать, есть ли еще процессы с открытыми fds для подчиненная сторона псевдотерминала (см. комментарий @JdeBP ниже), sshd
не использует их, поэтому просто ожидает завершения процесса, в котором он выполнил оболочку входа в систему удаленного пользователя и затем уходит.
После этого выхода ведущая сторона пары pty закрывается , что означает, что pty уничтожается, поэтому процессы, контролируемые ведомым устройством, получат SIGHUP (который по умолчанию завершит их).
Правка : последняя часть была неправильной, хотя конечный результат тот же. См. @ pynexj answer для правильного описания того, что именно происходит.
Причина в том, что &
не передаются в оболочку, а передаются в красное смещение в качестве параметра (для проверки посмотрите на ps -aux
). Чтобы решить эту проблему, создайте скрипт, например.
redshift -c /etc/redshift.conf &
в /root/bin/redshift.sh
. Chmod 755 и отредактируйте /etc/lightdm/lightdm.conf.d/90-redshift.conf
, чтобы он содержал
[Seat:*]
display-setup-script=/root/bin/redshift.sh
([Seat:*]
кажется новым [SeatDefaults]
).