systemd、logrotate 和 PID 文件

systemd、logrotate 和 PID 文件

我正在为 debian 8 和 systemd 打包一些守护进程。

守护进程可以自行创建 PID 文件,但由于非 root 用户,它无权写入 /run。它过去通过旧的 sysV init 脚本创建 PID 文件,但在 systemd 上不起作用。

我可以在服务文件中使用这样的解决方法:

Environment="PIDDIR=/var/run/mydaemon"
PermissionsStartOnly=true
ExecStartPre=/bin/mkdir -p $PIDDIR
ExecStartPre=/bin/chown -R mydaemon. $PIDDIR

但它看上去不对。

我可以使用 /tmp 作为 $PIDDIR,但它似乎也是错误的。

实际上我需要 PID 文件的唯一原因是 logrotate 的 postrotate 向守护进程发送 SIGUSR1:

[ -s /run/mydaemon.pid ] && kill -USR1 `cat /run/mydaemon.pid`

也可以用 pgrep 搜索守护进程的 pid,但是似乎不可靠。

复制截断logrotate 似乎不是最好的选择,因为存在丢失部分日志的风险。

那么,通过 systemd 管理 PID 文件的正确方法是什么?

有没有办法通过 systemd 向守护进程发送随机信号?

答案1

Systemd 有专门的机制来创建临时目录和文件:systemd-tmpfiles 和 tmpdfiles.d

简而言之,让你的包放置一个文件/usr/lib/tmpfiles.d/mydaemon.conf

 #Type Path            Mode UID      GID    Age Argument
 d     /run/mydaemon   0755 mydaemon daemon -   -

答案2

在 systemd .service 文件中使用

ExecReload=/bin/kill -USR1 $MAINPID

并在 logrotate 脚本中使用

systemctl reload SERVICENAME

相关内容