Яка різниця між запуском програми як демона і переведенням її у фоновий режим із "&"?


Відповіді:


31

Традиційний спосіб демонізування:

fork()
setsid()
close(0) /* and /dev/null as fd 0, 1 and 2 */
close(1)
close(2)
fork()

Це гарантує, що процес більше не знаходиться в тій же групі процесів, що і термінал, і, таким чином, не буде вбито разом з ним. Перенаправлення IO полягає в тому, щоб вихід не відображався на терміналі.


5
тож якщо термінал, який породжує фоновий процес (&) закритий, фоновий процес також припиняється?
користувач1561108

9
Процес отримає SIGHUP, коли термінал вийде, обробник за замовчуванням для цього сигналу повинен припинити процес.
Денніс Каарсемейкер

12
Будь ласка, додайте &пояснення частини до своєї відповіді. Це здається неповним .. якщо ви перевірите оригінальне запитання.
mtk

1
Це тому, що запуск речей у фоновому режимі з & не змушує нічого робити особливого :)
Денніс Каарсемейкер

33

Для демона те, що ви хочете, - це процес, який ні до чого не пов'язаний. Як мінімум, ви хочете, щоб він був на своєму сеансі, не був приєднаний до терміналу, не мав жодного дескриптора файлів, успадкованого від батьків, нічого не відкрито, не мати батьків, які доглядають за вами (крім init). каталогів, /щоб не запобігти розміщенню ...

Щоб відірватися від терміналу, ви створюєте новий сеанс, однак, щоб створити сеанс, ви не повинні бути лідером групи (або сеансу), тому найкраще - роздрібнити новий процес. Якщо припустити, що з батьків є вихід, це також означає, що процес більше не матиме батьків і буде прийнятий init. Потім закрийте всі можливі дескриптори файлів chdir("/")( ви не можете закрити поточну робочу директорію, щоб випустити такий ресурс, як для дескрипторів файлів, /тому що поточні робочі каталоги принаймні не заважають відключити каталоги).

Оскільки цей процес є лідером сесії, існує ризик, що якщо він коли-небудь відкриє термінальний пристрій, він стане контрольним процесом цього терміналу. Вдруге запит гарантує, що цього не відбудеться.

З іншого боку, &, в інтерактивних оболонках, розщеплює та створює нову групу процесів (щоб не потрапити до групи переднього плану терміналу), а в неінтерактивних оболонках - розгортає процес і ігнорує SIGINT у ньому. Він не відривається від терміналу, не закриває дескриптори файлів (хоча деякі оболонки знову відкриють stdin до /dev/null) ...


в чому полягає користь для chdir ("/")? закрити дескриптор файлу?
Тімоті Леун

@TimothyLeung, див. Редагування.
Стефан Шазелас

8

Різниця між запуском програми / процесу як демона і відведенням його до фону за допомогою ampersand в основному пов'язана з власністю.

Найчастіше батьківський процес демона - це процес init (найперший процес, який запускається в системі Unix), тому, що демон є дитиною цього процесу, означає, що він не знаходиться під вашим безпосереднім контролем як непривілейований користувач . З іншого боку, перекидання програми / процесу на другий план означає, що ви можете в будь-який момент передзвонити її на передній план та / або вбити.


1
Також, щоб відповісти на вищезазначену технічну сторону від'єднання процесу та його збереження як дочірнього терміналу, ви можете спробувати запустити "nohup firefox &"
Одай

7

З command &вашим процесом буде вбито сигнал SIGHUP, коли батьків загине.

Однак у сисадмінів є доступ до деяких обхідних шляхів.

У системі bash ви можете використовувати:

(trap '' HUP; command) &

Це відкриває підзаглушку, захоплює HUPсигнал порожнім обробником та амперсанд / вилазить його.

Вихідні дані все одно можуть бути перенаправлені на неправильні tty. Або загубитися.
Ви можете виправити це &>command.out, 1>output.outабо2>errors.out

У більшості систем ви також можете мати доступ до nohupкоманди.
nohupзначно спрощує цей процес. Це цілком стандартно, але я виявив, що в багатьох вбудованих дистрибутивах ARM вбудовані дистрибутиви ARM відсутні. Ви просто пишете:

nohup command &

..і ви закінчили. Вихід буде перенаправлений, IIRC, на nohup.out, але це ім'я файлу можна змінити за допомогою параметра.


2
Зауважимо лише, що за допомогою ZSH ви можете роз'єднати command &пізніше з оболонки, з disownякою потім працює як пост-нохуп.
математика
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.