我嘗試設定一個 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