Когда вы закрываете терминал, терминал отправляет сигнал SIGHUP на оболочку; оболочка, в свою очередь, отправляет сигнал SIGHUP всем дочерним группам процессов, которые включают фоновые группы процессов;
То, как каждый отдельный процесс будет реагировать на сигнал, полностью зависит от процесса: если процесс не определил обработчик для сигнала и не сообщит ядру (посредством некоторого системного вызова, такого как signal()
или sigaction()
), что он хочет обработать его, ядро выполняет обработчик сигнала по умолчанию, который в случае сигнала SIGHUP состоит в завершении процесса.
Однако, когда вы запускаете команду с sudo
, UID sudo
процесса и его дочернего процесса устанавливается в 0
(root); в общем случае, если UID процесса, отправляющего сигнал, 0
(root) или совпадает с целевым процессом, ядро отклоняет сигнал (то есть: процесс не может отправлять сигналы процессу, принадлежащему другому пользователю, если только процесс отправка сигнала принадлежит root); вот почему пользовательский процесс, такой как экземпляр Bash, запущенный терминалом, не может SIGHUP sudo
процесса и, в конечном итоге, закрытие терминала не влияет на процесс, запущенный с sudo
.