Я упаковываю какой-то демон для debian 8 и systemd.
Демон может сам создать PID-файл, но у него нет прав на запись / запуск из-за пользователя без полномочий root. Раньше он создавал PID-файл через старый сценарий инициализации sysV, но не работает на systemd.
Я могу использовать обходной путь в служебном файле следующим образом:
Environment="PIDDIR=/var/run/mydaemon"
PermissionsStartOnly=true
ExecStartPre=/bin/mkdir -p $PIDDIR
ExecStartPre=/bin/chown -R mydaemon. $PIDDIR
Но это выглядит неправильно.
Я могу использовать / tmp как $ PIDDIR, но это тоже кажется неправильным.
На самом деле единственная причина, по которой мне нужен PID-файл, - это postrotate logrotate, отправляющий SIGUSR1 демону:
[ -s /run/mydaemon.pid ] && kill -USR1 `cat /run/mydaemon.pid`
Также можно искать pid демона с помощью pgrep, но это кажется ненадежным.
копировать в logrotate кажется не лучшим вариантом из-за риска потерять часть журнала.
Итак, как правильно управлять PID-файлами через systemd?
А есть ли способ посылать случайные сигналы демонам через systemd?
В Systemd есть специальный механизм для создания временных каталогов и файлов: systemd-tmpfiles и tmpdfiles.d
Короче говоря, ваш пакет сбросит файл /usr/lib/tmpfiles.d/mydaemon.conf
:
#Type Path Mode UID GID Age Argument
d /run/mydaemon 0755 mydaemon daemon - -
в файле systemd .service используйте
ExecReload=/bin/kill -USR1 $MAINPID
и в скрипте logrotate используйте
systemctl reload SERVICENAME