откуда SIGHUP?(sshd разветвляет дочерний элемент для создания нового сеанса, убивает этого дочернего элемента, и все процессы в сеансе умирают) - PullRequest
5 голосов
/ 03 апреля 2011

sshd разветвляет дочерний процесс для создания нового сеанса.вот вывод (частичный) pstree:

sshd(1230) -- sshd(1234) -- bash
           (...)    
             |- sshd(1235) -- bash -- a.out -- a.out

После запуска «kill -9 1235», a.out умирает (получен сигнал SIGHUP)

Почему?

ТКС!

1 Ответ

8 голосов
/ 03 апреля 2011

ssh (наряду с эмуляторами терминала, screen, tmux, script и некоторыми другими программами) использует объект, называемый "псевдо-tty" (или "pty"), который ведет себя как модемное соединение. Я описываю это так, потому что это историческое происхождение этого поведения: если вы по какой-то причине потеряли модемное соединение, драйвер tty (или pty) обнаружил потерю носителя и отправил SIGHUP ("Hangup") вашему сессия. Это позволяет программам сохранять свое состояние (например, vi / vim сохранит все файлы, которые вы изменили, но не сохранили для восстановления), и аккуратно завершит работу. Точно так же, если сетевое соединение по какой-то причине обрывается (кто-то споткнулся о шнур питания или сетевой кабель? ... или sssh сброшенное ядро ​​по какой-то нечетной причине), pty отправляет SIGHUP в ваш сеанс, чтобы получить шанс сохранить любые несохраненные данные.

Технически, драйвер tty / pty отправляет сигнал каждому процессу в группе процессов, подключенной к терминалу (группы процессов также связаны с управлением заданиями оболочки, но это было их первоначальной целью). Некоторые другие сигналы терминала обрабатываются таким же образом, например Ctrl + C отправляет SIGINT и Ctrl + \ отправляет SIGQUITCtrl + Z отправляет SIGTSTP, а программы, которые не обрабатывают SIGTSTP путем приостановки, отправляют SIGSTOP; этот двойной сигнал позволяет vim верните терминал из режима редактирования в обычный режим и во многих эмуляторах терминала переключитесь в буфер предварительного редактирования экрана).

...