Ubuntu
執行 cron 本身是否具有與通過 init.d 腳本相同的行為?
我正在使用一些在伺服器上啟動 cron 的程式碼(它在啟動時沒有執行)。啟動 cron 的腳本設置了一些日誌記錄,然後簡單地呼叫
cron
. 它不使用/etc/init.d/cron
orservice cron start
。以這種方式啟動 cron 後,
service cron status
似乎service cron stop
可以愉快地工作,並且存在指定的 PIDFILE/etc/init.d/cron
。我將日誌行放入
/etc/init.d/cron
中,看起來cron
獨立執行不會呼叫腳本。# service cron status script is running * cron is running # service cron stop script is running * Stopping periodic command scheduler cron [ OK ] # cron #
這裡發生了什麼?這僅僅是因為
cron
二進製文件和 /etc/init.d/cron 腳本對 pidfile 的位置使用相同的約定嗎?
您的假設是正確的:Vixie Cron有一個固定的 pidfile 位置 (
/var/run/crond.pid
),這也可以防止執行它兩次。init.d腳本,也被稱為 by
service
使用標準/lib/lsb/init-functions
,總結為:
- 該
start
動作只是呼叫/usr/sbin/cron
(通過/sbin/start-stop-daemon
助手),- 該
stop
操作只是發送SIGTERM
到 pidfile 中的 PID(通過/sbin/start-stop-daemon
),- 行動
status
相當於。kill -0 $(cat /var/run/crond.pid)
但是,如果您安裝了systemd,則標準的 init 函式被重寫,並且不再檢測到直接
/lib/lsb/init-functions.d/40-systemd
執行cron :piotr@bialykiel:~$ sudo /usr/sbin/cron piotr@bialykiel:~$ sudo /etc/init.d/cron status ● cron.service - Regular background program processing daemon Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled) Active: inactive (dead) since Sun 2020-02-02 09:12:43 CET; 5min ago Docs: man:cron(8) Process: 734 ExecStart=/usr/sbin/cron -f $EXTRA_OPTS (code=killed, signal=TERM) Main PID: 734 (code=killed, signal=TERM)
因為systemd想要
CGroup
每個服務。更糟糕的是start
並且restart
不會工作,因為cron將在已經存在的 pidfile 上失敗並且stop
不會殺死您創建的cron實例。