Как описать исполняемый файл как демон
Что проверяют
Знаете ли вы, как сервис живёт в современном Linux: не через самодельное двойное ветвление процесса, а через systemd. Следом обычно просят написать unit-файл по памяти и объяснить, как сервис поднимется после падения и перезагрузки.
Как отвечать
Главная мысль: программа работает на переднем плане и пишет логи в stdout и stderr, а превращением в демона занимается менеджер сервисов. Unit кладут в /etc/systemd/system/myapp.service:
[Unit]:Description, а для сетевого сервисаAfter=network-online.targetвместе сWants=network-online.target;[Service]:ExecStart=/usr/local/bin/myapp,User=отдельного непривилегированного пользователя,WorkingDirectory=, переменные черезEnvironmentFile=;- тип запуска:
Type=simpleилиType=execдля программы, которая не форкается,Type=notify, если она сама сообщает о готовности черезsd_notify, иType=forkingтолько для старых демонов, которые уходят в фон сами; - перезапуск:
Restart=on-failureиRestartSec=5, а от бесконечного цикла падений защищаютStartLimitIntervalSecиStartLimitBurstв секции[Unit]; - изоляция:
NoNewPrivileges=yes,ProtectSystem=strict,PrivateTmp=yes. Оценку даётsystemd-analyze security myapp; [Install]:WantedBy=multi-user.target, без этой секцииsystemctl enableне создаст автозапуск.
Дальше systemctl daemon-reload, systemctl enable --now myapp, логи через journalctl -u myapp -f.
Классику тоже стоит знать: fork, setsid, второй fork, chdir("/"), umask, закрытие дескрипторов. В контейнере демонов нет вовсе: процесс работает как PID 1 и должен сам обрабатывать SIGTERM, либо запускается через tini или docker run --init.
Где спотыкаются
Называют демоном nohup ./app & или сессию в screen. Процесс не переживёт перезагрузку, никто не перезапустит его после падения.
Оставляют в программе самодемонизацию и пишут Type=simple. Systemd видит, что основной процесс завершился, считает сервис остановленным и убивает потомков.
Правят unit и забывают daemon-reload, или путают start и enable: сервис работает до первой перезагрузки.