我正在为 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