Мне было просто интересно, например, когда я запускаю qtox
с:
qtox &
А затем закройте терминал, закройте qtox
его. Однако при запуске etherape
с помощью:
sudo etherape &
Закрытие Терминала не закрывает и не создает никаких проблем для Etherape. И среди разных приложений разное поведение, некоторые закрываются, когда терминал, другие нет, как получается? Почему одни закрываются, а другие нет? Я использую Ubuntu GNOME 15.10 с GNOME 3.18.
qtox
выходить, когда закрываете терминал, вы всегда можете запустить егоnohup qtox &
.Ответы:
Когда вы закрываете терминал, терминал отправляет сигнал SIGHUP на оболочку; оболочка, в свою очередь, отправляет сигнал SIGHUP всем дочерним группам процессов, которые включают фоновые группы процессов;
То, как каждый отдельный процесс будет реагировать на сигнал, полностью зависит от процесса: если процесс не определил обработчик для сигнала и не сообщит ядру (посредством некоторого системного вызова, такого как
signal()
илиsigaction()
), что он хочет обработать его, ядро выполняет обработчик сигнала по умолчанию, который в случае сигнала SIGHUP состоит в завершении процесса.Однако, когда вы запускаете команду с
sudo
, UIDsudo
процесса и его дочернего процесса устанавливается в0
(root); в общем случае, если UID процесса, отправляющего сигнал,0
(root) или совпадает с целевым процессом, ядро отклоняет сигнал (то есть: процесс не может отправлять сигналы процессу, принадлежащему другому пользователю, если только процесс отправка сигнала принадлежит root); вот почему пользовательский процесс, такой как экземпляр Bash, запущенный терминалом, не может SIGHUPsudo
процесса и, в конечном итоге, закрытие терминала не влияет на процесс, запущенный сsudo
.источник
nohup
перед теми команды, которые закрываются с SIGHUP :) Upgoatedsudo
.sudo
просто запускает команду от имени другого пользователя, и вы не можете посылать сигнал процессам других пользователей. Смman 2 kill
.sudo
это за беднякиnohup
?sudo
сsudo
егоnohup
побочным эффектом, учитывая все другие недостатки.nohup
, он создает ненужныеnohup.out
файлы после него. Скорее используйтеdisown
встроенную команду.