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


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.