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

27

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

qtox &

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

sudo etherape &

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

кос
источник
1
Может ли быть так, что вы открываете терминал, запускаете qtox, закрываете терминал, все вам !! Но во-вторых, вы открываете терминал, sudo запускает etherape, теперь вы закрываете свой терминал, но sudo продолжает работать, пока sudo не закроется?
Кен Моллеруп
Ну, если вы не хотите qtoxвыходить, когда закрываете терминал, вы всегда можете запустить его nohup qtox &.
Терренс
@Terrance: Ну, в этом вопросе я специально спрашивал, почему, а не как ... Это был бы мой другой вопрос ... :)
1
@ParanoidPanda Ах, хорошая мысль. Виноват. =)
Terrance

Ответы:

36

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

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

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

кос
источник
7
И именно поэтому нам нужны nohupперед теми команды, которые закрываются с SIGHUP :) Upgoated
Сергей Колодяжный
9
Я думаю, в этом нет ничего волшебного sudo. sudoпросто запускает команду от имени другого пользователя, и вы не можете посылать сигнал процессам других пользователей. См man 2 kill.
el.pescado
@ el.pescado Так что же sudoэто за бедняки nohup?
Хаген фон Айцен
7
@HagenvonEitzen Если хотите, но я бы очень воздержался от запуска команды, которая не требует sudoс sudoего nohupпобочным эффектом, учитывая все другие недостатки.
Кос
2
@ Серг нам не нужен nohup, он создает ненужные nohup.outфайлы после него. Скорее используйте disownвстроенную команду.
Руслан