Назад | Перейти на главную страницу

systemd, logrotate и PID-файлы

Я упаковываю какой-то демон для 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