что происходит с процессом, когда его родительский процесс sshd завершается?

Если я запускаю оболочку на host1 и делаю ssh host2 some-command, затем закрываю окно терминала (или иным образом убиваю процесс ssh на host1), кажется, что процесс sshd на host2 завершается довольно быстро. Но... что происходит с some-command? В зависимости от того, какая это команда, она иногда завершается, а иногда нет. Какие сигналы получает some-command? Какие файловые дескрипторы (если они есть) манипулируются и как?


person Glyph    schedule 01.11.2011    source источник


Ответы (2)


Он не получает никаких сигналов. Если они не были каким-либо образом перенаправлены, три стандартных потока ввода-вывода были каналами в/из процесса ssh, поэтому чтение из стандартного ввода вернет EOF, а запись либо в стандартный вывод, либо в стандартный вывод потерпит неудачу и вызовет SIGPIPE. Если какая-то команда не выполняет ввод-вывод в стандартных потоках, у нее не будет причин для преждевременного завершения.

person William Pursell    schedule 01.11.2011
comment
уверены ли вы? ssh может создать терминал, также известный как псевдотерминал (в зависимости от параметров), и если это произойдет, я ожидаю, что другие процессы, для которых этот tty является управляющим терминалом, получат SIGHUP. - person Ben Voigt; 01.11.2011
comment
Ага, но это ключ. ssh somehost some-command не выделяет pty! Он просто делает трубу. Вы должны попросить pty с -t. Таким образом, поведение, которое я видел, которое заставило меня задать этот вопрос (мои рабочие места не получают никакого сигнала, просто их стандартный ввод закрыт), имеет смысл. - person Glyph; 01.11.2011

Если на вашем компьютере есть dtrace, вы можете проверить его с помощью

dtrace -n 'proc:::signal-send /pid/ { printf("%s -%d %d",execname,args[2],args[1]->pr_pid); }'

команду здесь. См. также это.

У меня сейчас нет dtrace на моей Linux-машине. Но я могу проверить это позже.

person Shayan Pooya    schedule 01.11.2011