Есть ли «стандартный» способ создания демона в Debian?

17

Мне нужно создать демон из приложения в Debian. Есть ли в Debian стандартный инструмент для этого, например «upstart» в Ubuntu? Мне нужны только команды start-stop, чтобы запустить программу как демон с некоторыми опциями и файлом pid и убить его с помощью файла pid.

Я посмотрел на init.d, но, похоже, они предназначены для запуска при загрузке. Я хочу запустить мой демон вручную.

Куроки Казе
источник
2
Обратите внимание, что это изменилось для Debian Jessie, который переключил значение по умолчанию с sysvinit на systemd.
Жюль
У debian jessie, похоже, есть какая-то форма обратной совместимости, по крайней мере, с использованием / usr / bin / service - если нет конфигурации upstart (/etc/init/ndomservice broadcast.conf) и есть конфигурация sysvinit (/ etc / init). d / {service}), затем / usr / bin / service будет взаимодействовать с /etc/init.d/ enjservice}, как и раньше, в разделе sysvinit.
Кевин

Ответы:

18

Вы можете создать своего демона вручную, следуя /etc/init.d/skeletonфайлу в Debian.

Вы можете использовать /usr/bin/serviceдля запуска $ sudo service yourdaemon startи остановки $ sudo service yourdaemon stopвашего демона.

Пока вы не свяжете свой сценарий ни с одним из /etc/rc?.dкаталогов, он не запустится при запуске.

С другой стороны, вы можете захотеть взглянуть на daemontools , который не является стандартным для Debian, но имеет некоторые интересные особенности.

chmeee
источник
Благодарю. Кажется, у меня нет /usr/bin/serviceсистемы (это Debian Lenny), но я могу запускать сценарии напрямую /etc/init.d/myservice start.
Куроки Казе
3
Вы можете использовать , sudo invoke-rc.d yourservice startа также
chmeee
не знал этого. Thx
Chiggsy
3

Debian (и Ubuntu) имеют вспомогательную программу, start-stop-daemonкоторая используется в скриптах инициализации. У него довольно много вариантов запуска и отслеживания демонов. Вы можете просто написать обертку вокруг него, например,

case $1 in
start) start-stop-daemon --start --exec /my/exec/prog --pidfile /my/pid/file --background
       ;;
stop)  start-stop-daemon --stop --pidfile /my/pid/file 
       ;;
esac
Дэн Андреатта
источник
3
Я бы предпочел /etc/init.d/skeleton, предложенный выше, потому что он также включает в себя части INIT INFO, которые помогают с переходом на загрузку зависимостей
dpavlin
2

Чтобы правильно демонизировать процесс для Debian, вам нужно будет сделать несколько шагов, в том числе отойти от процесса управления, сбросить IO и создать файл идентификатора процесса, чтобы играть хорошо. Вместо этого вы можете использовать что-то вроде программы-демона из пакета с тем же именем, чтобы сделать это для вас. Если это то, что вы хотели сделать, ответ можно найти здесь, в StackOverflow: /programming/3095566/linux-daemonize.

Команда upstart больше похожа на команду Debian invoke-rc.d или команду service из пакета sysvinit-utils. Они ожидают отработки сценариев инициализации в /etc/init.d. В Debian принято создавать один из них для вашего пакета и использовать его в программе start-stop-daemon, как вы можете видеть в примере /etc/init.d/skeleton.

Тот факт, что вы создаете скрипт /etc/init.d/myservice, не означает, что он должен запускаться автоматически. Вы можете настроить уровни запуска, при которых он останавливается и запускается автоматически, используя такой инструмент, как update-rc.d. Это описано более подробно в разделе Отключение запуска службы на всех уровнях выполнения?

JLA
источник