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


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встроенную команду.
— Руслан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.