Нашел пример демона, запустил из консоли. Вопрос - как им управлять, в частности остановить? Как перезапускать в случае ошибки? И как его сделать фоном, чтобы в консоли можно было писать команды? Благодарю.
#!/bin/bash
while true; do
begin=`date +%s`
php /var/www/html/rules/script.php
end=`date +%s`
if [ $(($end - $begin)) -lt 5 ]; then
sleep $(($begin + 5 - $end))
fi
done
это если демон управления не умеет просто ничего.
вышеупомянутый системд сам разберется с подшефным процессом. и консоль в лог направит. без всяких пидов и его пристрелит и детей и т.д.
> демон должен быть написан таким образом
> Демон должен уметь оставлять свой PID
С systemd такое не нужно, например. Там stdout и stderr автоматом в логи перенаправляются, а PID основного и всех дочерних процессов автоматически трекаются.
systemd это хорошо, но рекомендации по написанию демонов никто не отменял.
Вопрос же не в том, как запустить непонятный процесс, а человек нашел какой-то демон и хочет с ним разобраться, научиться им управлять. Я и говорю, что для этого управление должно также поддерживаться со стороны демона.
Минимальные рекомендации для написания демонов вроде такие:
* fork от родительского процесса, чтобы не зависеть от его закрытия. В Линукс процесс автоматом перейдет под init и будет работать в бэкграунде, независимо от процесса, который его запустил.
* setsid - Сделать новую сессии. И отключиться от tty родительского процесса
* Catch signals - Игнорировать или обрабатывать сигналы для корректного завершения и дополнительных действий (например перечитать конфиг без перезапуска).
* fork еще раз, чтобы процесс стал главным в своей сессии. Тогда можно даже получить TTY снова, уже для себя (tty может иметь только лидер сессии)
* chdir - Поменять директорию процесса на нужную
* umask - Если нужно работать с файлами.
* close - Закрыть все файловые дескрипторы (включая stdout, stderr, stdin), которые могли прийти из родительского процесса открытыми. Затем можно открыть только нужные.