Чому деякі програми, запущені з терміналу, використовують "&", коли термінал робить, а інші - ні?


27

Мені просто було цікаво, наприклад, коли я запускаю qtox:

qtox &

А потім закрити Термінал, qtoxзакривається з ним. Однак при запуску etherapeвикористовуйте:

sudo etherape &

Закриваючий термінал не закриває і не викликає проблем у Etherape. І серед різних застосунків є різна поведінка, одні закриваються, коли це робить Термінал, інші - ні, як це? Чому одні закриваються, коли інші ні? Я запускаю Ubuntu GNOME 15.10 з GNOME 3.18.


1
Можливо, ви відкриваєте термінал, запускаєте qtox, закриваєте термінал, все ви !! Але вдруге ви відкриваєте термінал, sudo запускає етерапи, тепер ви закриваєте свій термінал, але sudo продовжує працювати, поки sudo не закриється?
Кен Моллеруп

Ну, якщо ви не хочете qtoxвиходити, коли закриєте термінал, ви завжди можете запустити його nohup qtox &.
Терранс

@Terrance: Ну, у цьому питанні я конкретно запитував чому, а не як ... Це було б моє інше питання ... :)

1
@ParanoidPanda Ах, хороший момент. Моє ліжко. =)
Терранс

Відповіді:


36

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

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

Однак, коли ви запускаєте команду з sudo, UID sudoпроцесу та його дочірнього процесу встановлюється 0(root); в цілому, якщо UID процесу передачі сигналу 0(root) або такий же, як і цільовий процес, ядро ​​відхиляє сигнал (тобто: процес не може надсилати сигнали до процесу, що належить іншому користувачеві, якщо процес передача сигналу належить корінь); тому процес, керований користувачем, такий як екземпляр Bash, керований терміналом, не може ЗНАЧИТИ sudoпроцес і, в кінцевому рахунку, закриття терміналу не впливає на процес, розпочатий з sudo.


7
І тому нам потрібні nohupперед тими командами, які закриваються з SIGHUP :) Оновлений
Сергій Колодяжний

9
Я думаю, що в цьому немає нічого магічного sudo. sudoпросто запускає команду як інший користувач, і ви не можете надсилати сигнал процесам інших користувачів. Див man 2 kill.
el.pescado

@ el.pescado Так це sudoякась бідна людина nohup?
Хаген фон Ейтцен

7
@HagenvonEitzen Якщо ви хочете, але я сильно утримуються від виконання команди , яка не вимагає sudoз sudoдля його nohupпобічного ефекту, який вважається все інші недоліки.
kos

2
@ Серг нам не потрібен nohup, він створює непотрібні nohup.outфайли після нього. Скоріше використовуйте disownвбудовану команду.
Руслан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.