Фонове завдання (тобто розпочате з &) все ще має stdin, stdout та stderr, підключені до терміналу, в якому він був запущений. Він може раптом записати (наприклад, повідомлення про помилки) в термінал ("заважаючи" роботі в переднього плану) або призупиніть очікування введення з клавіатури (спочатку потрібно поставити його на передній план). Звичайно, ви можете перенаправити stdout та stderr у файл або в / dev / null, щоб запобігти запису фонового завдання на термінал.
Фонове завдання також можна поставити на перший план - наприклад. поточне завдання переднього плану зупиняється, а команда fg
(переднього плану) використовується для виведення фонового завдання на перший план. Фонове завдання також може бути досягнуто сигналами з терміналу - наприклад. SIGHUP, коли ви закриваєте термінал, який зазвичай закінчує (більшість) програм, запущених у терміналі.
Демон, як і ті, які починаються автоматично з init.d, але які також можна запустити вручну з терміналу - з іншого боку, працює за відключенням від будь-яких терміналів. Навіть якщо він був запущений вручну з терміналу, демон буде від'єднаний від терміналу, тому він не може ні записувати (stdout, stderr), ні читати (stdin). Він також "несприйнятливий" до сигналів, що "автоматично" надсилаються терміналом. (хоча ви можете надсилати на нього сигнали, використовуючи kill -signal pid
).
"Передумови" та "передній план" позначають стан процесу для деякого терміналу - коли це процес, який зараз керує терміналом чи ні. Оскільки демони не підключені до терміналу (але всіляко його відключили від нього), можна не сказати, що він працює у фоновому режимі. Демони просто запущені в процеси, не пов'язані з терміналом - ні на передньому, ні на задньому плані.
Якщо ви використовуєте ps
параметри, які показують, який термінал використовує процес, ви побачите, що і передній, і фоновий завдання пов'язані з терміналом (наприклад, tty2). Демони, з іншого боку, мають "?" у цій галузі.
Демони зазвичай є такими, навіть якщо вони розпочалися вручну. Створення власного демона - це чимала робота - є деякі хитрощі, щоб повністю відключити його від терміналу. Вам слід створити власну користувачу / групу, якою вона працює. Зазвичай ви повинні використовувати / tmp, / var / tmp або / var / run, якщо ви хочете, щоб він створював файли - зазвичай він не повинен мати прав більше ніде. Оскільки він не може повідомляти про помилки в терміналі, ви повинні змусити його записати в файл журналу (наприклад, це власний файл журналу в / var / log). Демони повинні зробити запис у / var / run із поточним PID та перевірити, чи вже запущений інший примірник. Він повинен дотримуватися блокування (/ var / lock) для файлів чи пристроїв, де це можливо. Він повинен відповісти на SIGHUP, перезавантаживши свої конфігураційні файли та використовуючи оновлені конфігурації.
Ще один момент - як працює більшість демонів. Демон - це звичайно виконаний файл, який може працювати в двох різних режимах; залежно від того, це початковий демон - батьківський - запускається під час завантаження або вручну ... або дитина, породжена цим батьком. Батьківський процес, як правило, просто сидить і чекає якоїсь події - конкретного часу, часу, спроби підключення до певного мережевого порту чи будь-коли. Коли це відбувається, батько створює ідентичний самому собі дочірній процес (використовуючи системний виклик fork ()) - і негайно повертається до очікування чергової події (і, можливо, нерестує більше дітей). Це дочірній процес, який насправді виконає цю роботу - як синхронізація диска, виконання команди (наприклад cron
) або встановлення мережевого підключення (наприклад, sshd
абоftpd
). Єдина відмінність між батьком і дитиною полягає в тому, що вони отримали різні PID і що PPID (Parent-PID) дитини є PID батьківського процесу - це може бути використане для визначення того, чи є процес батьком або дитиною. Отже, той самий процес повинен мати можливість працювати в двох режимах - як очікуючий (і нерестовий) батько, або як працююча дитина.
Хоча написати демона не складно, це теж не банально - як ви бачите, існує досить багато "хитрощів", які ви повинні знати першими. Взагалі, я думаю, що написання демона вимагає великих зусиль для дуже невеликого прибутку порівняно з іншими альтернативами:
Використання nohup
або disown
фонове завдання зазвичай є досить хорошою альтернативою, оскільки він підтримує процес живим, навіть якщо термінал закривається. Часто гарна ідея перенаправити stdout та stderr у файл або в / dev / null, хоча. Для більш інтерактивних програм screen
- це хороший спосіб поставити щось «далеко», поки вам це не потрібно. at
, batch
а crontab
також варто подумати.