Які практичні відмінності з точки зору sysadmin при розгортанні сервісів на основі системи Unix?
Які практичні відмінності з точки зору sysadmin при розгортанні сервісів на основі системи Unix?
Відповіді:
Традиційний спосіб демонізування:
fork()
setsid()
close(0) /* and /dev/null as fd 0, 1 and 2 */
close(1)
close(2)
fork()
Це гарантує, що процес більше не знаходиться в тій же групі процесів, що і термінал, і, таким чином, не буде вбито разом з ним. Перенаправлення IO полягає в тому, щоб вихід не відображався на терміналі.
&
пояснення частини до своєї відповіді. Це здається неповним .. якщо ви перевірите оригінальне запитання.
Для демона те, що ви хочете, - це процес, який ні до чого не пов'язаний. Як мінімум, ви хочете, щоб він був на своєму сеансі, не був приєднаний до терміналу, не мав жодного дескриптора файлів, успадкованого від батьків, нічого не відкрито, не мати батьків, які доглядають за вами (крім init). каталогів, /
щоб не запобігти розміщенню ...
Щоб відірватися від терміналу, ви створюєте новий сеанс, однак, щоб створити сеанс, ви не повинні бути лідером групи (або сеансу), тому найкраще - роздрібнити новий процес. Якщо припустити, що з батьків є вихід, це також означає, що процес більше не матиме батьків і буде прийнятий init. Потім закрийте всі можливі дескриптори файлів chdir("/")
( ви не можете закрити поточну робочу директорію, щоб випустити такий ресурс, як для дескрипторів файлів, /
тому що поточні робочі каталоги принаймні не заважають відключити каталоги).
Оскільки цей процес є лідером сесії, існує ризик, що якщо він коли-небудь відкриє термінальний пристрій, він стане контрольним процесом цього терміналу. Вдруге запит гарантує, що цього не відбудеться.
З іншого боку, &, в інтерактивних оболонках, розщеплює та створює нову групу процесів (щоб не потрапити до групи переднього плану терміналу), а в неінтерактивних оболонках - розгортає процес і ігнорує SIGINT у ньому. Він не відривається від терміналу, не закриває дескриптори файлів (хоча деякі оболонки знову відкриють stdin до /dev/null
) ...
Різниця між запуском програми / процесу як демона і відведенням його до фону за допомогою ampersand в основному пов'язана з власністю.
Найчастіше батьківський процес демона - це процес init (найперший процес, який запускається в системі Unix), тому, що демон є дитиною цього процесу, означає, що він не знаходиться під вашим безпосереднім контролем як непривілейований користувач . З іншого боку, перекидання програми / процесу на другий план означає, що ви можете в будь-який момент передзвонити її на передній план та / або вбити.
З 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
, але це ім'я файлу можна змінити за допомогою параметра.
command &
пізніше з оболонки, з disown
якою потім працює як пост-нохуп.