Bash

為什麼 crontab 不執行預定的 bash 腳本?

  • October 19, 2021

我已經看過很多次(1 , 2)這個問題,但我沒有找到答案,所以我開始了。

我正在執行Debian 11,但我想它對於任何類似 Debian 的發行版都一樣。

我的crontab -e樣子:

...
@reboot sleep 20 && /opt/isPromscaleOnOrOff.sh
...

和內容isPromscaleOnOrOff.sh

#!/bin/bash

SERVICE="promscale"
if pgrep -x "$SERVICE" >/dev/null
then
   echo "$SERVICE is running"
else
   echo "$SERVICE is stopped, I will run it now"
   nohup promscale --db-name asdf1234--db-password asdf1234 --db-user asdf1234 --db-ssl-mode allow --install-extensions & >> /dev/null
   disown
fi

但是當我重新啟動虛擬機時,腳本沒有執行,/var/log/syslog中的 cron 日誌顯示啟動腳本的 crontab。

我想要實現的目標可以很容易地完成程序的守護程序(我確實做到了),我只是想知道為什麼 crontab 不啟動我的腳本。

執行的作業cron與您在桌面上的執行時環境不同。您的任何PATH更改或其他環境變數設置~/.bashrc都不會自動傳播到您的cron作業。例如,沒有$DISPLAY,所以 GUI 程序需要特殊處理(讀取man xhost)。

cron可以在crontab文件 Read中為所有工作設置環境變數man 5 crontab

查看 echo "=== id ===";id;echo "=== set ===";set;echo "=== env ===";env | sort;echo "=== alias ===";alias每個環境中的結果。

由於該行的command部分crontab預設情況下由 解釋/bin/sh,其語法比 更簡單/bin/bash,因此我建議command呼叫設置環境的bash腳本(可執行、掛載、以 開頭#!/bin/bash),然後呼叫所需的程序。

引用自:https://unix.stackexchange.com/questions/673908