如何正確設定 root cron 作業

如何正確設定 root cron 作業

我嘗試設定一個 root cron 作業以 root 身分執行 Bash 腳本,在每個小時、每個月的每一天、每個月的 7,37 分鐘運行。該腳本位於/usr/bin並命名為tunlrupdate.sh.它更新 Tunlr 的 DNS。

$ ls -l /usr/bin/tunlrupdate.sh 
-rwxr-xr-x 1 root root 2133 Sep 24 15:42 /usr/bin/tunlrupdate.sh

該 Bash 腳本可用這裡

呼叫時,腳本會將發生的情況寫入位於下列位置的日誌中/var/log/tunlr.log

為了新增這個 root cron 作業,我使用了 root 的 crontab 標準

sudo crontab -e

並在最後插入這兩行。我希望 cron 以 root 身分執行腳本。

# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
07,37 * * * * root /usr/bin/tunlrupdate.sh

稍後的命令sudo crontab -l確認 cron 作業已被插入。

我確實重新啟動了 Ubuntu,並檢查了日誌檔案是否正確啟動了 cron 作業。然而,日誌檔案中沒有任何內容/var/log/tunlr.log意味著該作業從未成功啟動。

我確實檢查過是否從命令列運行腳本

sudo /usr/bin/tunlrupdate.sh

然後日誌檔案會相應更新。

為什麼這個 cron 作業沒有在我的系統中按計劃運行?

更新 1:到目前為止,所有建議的解決方案都不起作用。感謝 Olli 提供 CLI 來列出系統日誌sudo grep CRON /var/log/syslog。但是我確實收到了 CRON 錯誤

CRON[13092]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ]
&& find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php
/maxlifetime) ! -execdir fuser -s {} 2>/dev/null \; -delete)

使用建議的 PATH= 插入並使用腳本中函數的根目錄的絕對路徑,或不要使用這裡建議的解決方案。我仍然收到此錯誤。

經過一番搜索後,我找出了文件中的錯誤,/usr/lib/php5/maxlifetime如下所述這裡Change #!/bin/sh -e --> #!/bin/sh -x

然後列出我係統中的 CRON 錯誤日誌

sudo grep CRON /var/log/syslog
Feb 11 18:07:01 Marius-PC CRON[14067]: (root) CMD (root /usr/bin/tunlrupdate.sh)
Feb 11 18:07:01 Marius-PC CRON[14066]: (root) MAIL (mailed 1 byte of output; but got
status 0x00ff, #012)

我仍然沒有執行 bash 腳本。這次日誌中沒有顯示錯誤。為了確保這不是腳本的內容,我將腳本縮減為以下 3 行:

#!/bin/bash
LOGFILE=/var/log/tunlr.log
echo $LOGFILE >> $LOGFILE

我仍然沒有完成 cron 工作。日誌檔案中未寫入任何內容。那麼即使是一個空腳本也可能不會在 cron 中運行?我不明白。我知道嘗試將腳本簡化為以下兩行:

#!/bin/bash
exit 0

並且仍然是相同的錯誤日誌。 cron 腳本不執行...

答案1

如果您想將腳本作為普通用戶

crontab -e

並新增以下行:

07,37 * * * * /usr/bin/tunlrupdate.sh

如果你想運行你的腳本

sudo crontab -e

並且加入相同的行:

07,37 * * * * /usr/bin/tunlrupdate.sh

答案2

好吧,終於有了工作解決方案。在系統日誌中,我看到了重複且有趣的內容:

CRON[18770]: (root) CMD (root /usr/bin/tunlrupdate.sh)

聽起來 root 沒有被識別為 cmd。因為我已經透過使用使用了 root 的 cron $ sudo /usr/bin/tunlrupdate.sh。然後我嘗試使用原始腳本(更正日期 UNIX cmd 中的錯誤:%m,即月份,用於分鐘,即%M)以下(從 cron 行中刪除根):

$ sudo crontab -e
# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
07,37 * * * * /usr/bin/tunlrupdate.sh

事實證明這是最終的解決方案。 [儘管我發現大量文獻指出了 cron 行中 root 的錯誤行。那是個錯誤]。

答案3

cron 的一個「問題」是缺少環境變數(例如明顯的安全原因)。您可能缺少 PATH 和 HOME。您可以直接在腳本中或在 crontab 檔案中定義它們。

# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
PATH=/usr/bin
07,37 * * * * root /usr/bin/tunlrupdate.sh

您必須進行測試,直到您按照腳本的要求定義了所有必要的變數。

答案4

您可以在腳本中新增此行。因此,在檢查 cron 日誌並確認作業已執行後,您可以獲得與 crontab 相同的 $PATH。

/bin/echo $PATH > /root/path.txt

診斷 cron 腳本中的問題可能最好的方法就是在腳本中使用 env 命令來取得 SO 的所有環境變數。因此,只需將此行添加到您的腳本中即可。然後就可以分析輸出了allEvnVars.txt

/usr/bin/env > /root/allEvnVars.txt

另一個技巧是將腳本的輸出定向到某個地方。添加/root/log.log.這樣腳本的所有輸出都會保留在/root/log.log

07,37 * * * * root /usr/bin/tunlrupdate.sh  > /root/log.log

您也可以安排腳本每分鐘運行一次,以方便測試和檢查。

*/1 * * * * root /usr/bin/tunlrupdate.sh  > /root/log.log

相關內容