Systemd

systemd、logrotate 和 PID 文件

  • September 18, 2018

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

引用自:https://serverfault.com/questions/767279