
我正在使用一些在伺服器上啟動 cron 的程式碼(在啟動時沒有運行它)。啟動 cron 的腳本會設定一些日誌記錄,然後簡單地呼叫cron
.它不使用/etc/init.d/cron
或service 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 的位置使用相同的約定嗎?
答案1
你的假設是正確的:維克西·克朗有一個固定的 pidfile 位置 ( /var/run/crond.pid
),這也可以防止執行兩次。
這初始化檔案腳本,也透過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)
.
但是,如果您有系統安裝後,標準初始化函數被重寫/lib/lsb/init-functions.d/40-systemd
並運行計劃任務直接不再檢測到:
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)
自從系統想要CGroup
每項服務。更糟的是start
,這restart
是行不通的,因為計劃任務將在已經存在的 pidfile 上失敗並且stop
不會殺死計劃任務您建立的實例。