Я пишу скрипт , который я хотел бы работать в качестве демона при запуске без использования внешних инструментов , таких как DaemonTools или демон .
Linux Daemon Writing HOWTO
Согласно Linux Daemon Writing HOWTO , правильный демон имеет следующие характеристики:
- вилки из родительского процесса
- закрывает все файловые дескрипторы (то есть
stdin
,stdout
,stderr
) - открывает логи для записи (если настроено)
- изменяет рабочий каталог на постоянный (обычно
/
) - сбрасывает маску режима файла (umask)
- создает уникальный идентификатор сеанса (SID)
Демонизация Введение
Демон Введение идет дальше, утверждая , что типичный демон также:
- отсоединяется от терминала управления (если таковой имеется) и игнорирует все сигналы терминала
- отделяется от своей группы процессов
- ручки
SIGCLD
Как бы сделать все это в sh
, dash
или bash
сценарий только с общими инструментами Linux?
Сценарий должен быть в состоянии работать на максимально возможном количестве дистрибутивов без дополнительного программного обеспечения, хотя Debian является нашей основной задачей.
ПРИМЕЧАНИЕ. Я знаю, что в сети StackExchange есть множество ответов, в которых рекомендуется использовать nohup
или setsid
, но ни один из этих методов не отвечает всем вышеперечисленным требованиям.
EDIT: демон (7) страница руководства также дает некоторые указатели, хотя , кажется, некоторые различия между старым стилем SysV
демонами и новыми из systemd
них. Поскольку совместимость с различными дистрибутивами важна, пожалуйста, убедитесь, что ответ проясняет любые различия.
источник
daemon
и другие вещи предназначены для запуска произвольных сценариев оболочки без предоставления возможности запуска как демон. Поскольку вы автор, полностью контролирующий, как пишется этот скрипт, сделайте так, чтобы его можно было просто запустить из файла systemd unitfile или rc.d. Вы же указать «Правильные»!Ответы:
Используя systemd, вы сможете запустить скрипт как демон, создав простой модуль. Вы можете добавить множество различных опций , но это настолько просто, насколько вы можете получить.
Скажем, у вас есть сценарий
/usr/bin/mydaemon
.Вы создаете юнит
/etc/systemd/system/mydaemon.service
.Чтобы запустить демона, ты бежишь
Для запуска при загрузке вы включаете его
Если в системе, основанной на systemd, которой сегодня является большинство дистрибутивов Linux, это на самом деле не внешний инструмент. Негатив будет то, что он не будет работать везде, хотя.
источник
systemd
это не более «внешний инструмент», чемbash
.Я, наверное, что-то здесь упускаю; почему именно не
nohup
подойдет? Конечно , это не достаточно , в одиночку , но в дополнение к нему кажется простым.Насколько я вижу:
stdin
умирает в конце родительского сценария, однакоinit
(илиsystemd
)У меня сильное чувство, что я упускаю очевидное. Downvote, но, пожалуйста, скажите мне, что это такое :-)
источник
nohup
с&
и I / O для запуска несколькихC
утилит, не являющихся демонами, возможно, с дополнительной защитой, заключающейся в переносе вашейnohup
команды в asu -c "nohup ... &" -s /bin/bash systemUser
для запуска демона как непривилегированного пользователя.Команда Linux,
screen
содержащаяся в большинстве дистрибутивов, может демонизировать скрипт оболочки. Я использую это часто. Вот быстрый пример, чтобы начать, перечислить и выйти из отдельного сеанса экрана ...источник
screen
не отключает скрипт оболочки. Он просто запускает их в выделенном терминале и может отсоединиться от этого терминала (например, отключить клавиатуру от ПК), не закрывая сеанс. Итак, программа, запущенная в отдельном терминале, работает в фоновом режиме. Поэтому - отсоедините программу прохода в фоновом режиме.