Systemd
systemd、logrotate 和 PID 文件
我正在為 debian 8 和 systemd 打包一些守護程序。
守護程序可以自己創建 PID 文件,但由於非 root 使用者,它沒有寫入 /run 的權限。它曾經通過舊的 sysV init-script 創建 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 中的copytruncate似乎不是最佳選擇,因為有失去部分日誌的風險。
那麼,通過 systemd 管理 PID 文件的正確方法是什麼?
Аnd 有沒有辦法通過 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