Bash
為什麼 crontab 不執行預定的 bash 腳本?
我已經看過很多次(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
),然後呼叫所需的程序。