Ubuntu

執行 cron 本身是否具有與通過 init.d 腳本相同的行為?

  • February 2, 2020

我正在使用一些在伺服器上啟動 cron 的程式碼(它在啟動時沒有執行)。啟動 cron 的腳本設置了一些日誌記錄,然後簡單地呼叫cron. 它不使用/etc/init.d/cronor 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 的位置使用相同的約定嗎?

您的假設是正確的:Vixie Cron有一個固定的 pidfile 位置 ( /var/run/crond.pid),這也可以防止執行它兩次。

init.d腳本,也被稱為 byservice使用標準/lib/lsb/init-functions,總結為:

  1. start動作只是呼叫/usr/sbin/cron(通過/sbin/start-stop-daemon助手),
  2. stop操作只是發送SIGTERM到 pidfile 中的 PID(通過/sbin/start-stop-daemon),
  3. 行動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實例。

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