Почему некоторые программы, запущенные из Терминала с использованием '&', закрываются, когда Терминал делает, а другие нет?

Мне было просто интересно, например, когда я запускаю qtox с:

qtox &

А затем закройте терминал, qtox закрывается с этим. Однако при запуске etherape с помощью:

sudo etherape &

Закрытие Терминала не закрывает и не создает никаких проблем для Etherape. И среди разных приложений разное поведение, некоторые закрываются, когда терминал, другие нет, как получается? Почему одни закрываются, а другие нет? Я использую Ubuntu GNOME 15.10 с GNOME 3.18.

1 ответ

Решение

Когда вы закрываете терминал, терминал отправляет сигнал SIGHUP на оболочку; оболочка, в свою очередь, отправляет сигнал SIGHUP всем дочерним группам процессов, которые включают фоновые группы процессов;

То, как каждый отдельный процесс будет реагировать на сигнал, полностью зависит от процесса: если процесс не определил обработчик для сигнала и не сообщит ядру (с помощью некоторого системного вызова, такого как signal() или же sigaction() Если ядро ​​хочет обработать его, ядро ​​выполняет обработчик сигнала по умолчанию, который в случае сигнала SIGHUP заключается в завершении процесса.

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

Другие вопросы по тегам