我的腳本沒有按照 cron 計劃執行
我已經(在 Stack Exchange 的幫助下)製作了一個腳本,用於檢查 Web 應用程序是否可用並重新啟動 Web 應用程序守護程序以使其再次執行(通常在我工作之前會有所幫助)。它應該每小時執行一次。
我已將以下行添加到
sudo crontab -e
:0 * * * * bash /usr/local/bin/test.sh
的內容
test.sh
:#!/bin/sh HTTP_STATUS=$(lynx -head -source https://example.com |head -1 |awk '{print $2}') calendar=$(date "+%d-%m-%Y - %H:%M") LOG="Log is placed in /usr/local/bin/test.log" if [ "$HTTP_STATUS" = "503" ] then systemctl restart mydaemon echo "$calendar - site unavailable ($HTTP_STATUS). Daemon restarted." >> test.log elif [ "$HTTP_STATUS" = "200" ] then echo "$calendar - site available ($HTTP_STATUS)" >> test.log else echo "$calendar - site status unknown ($HTTP_STATUS)" >> test.log fi
我在 cron 中安排了另外兩個腳本,它們工作得很好,只是它們每天午夜執行。我所有的腳本都具有相同的權限和相同的所有者。
我的
test.log
文件不是每小時更新一次,所以我想腳本沒有執行。手動執行腳本會創建日誌條目。
crontab 在與登錄 shell 不同的環境中執行腳本;特別是,PATH 可能不同或未定義。
嘗試在命令(lynx,head …)上使用絕對路徑你可以得到它們
which <command>
此外,您應該指定 test.log 的路徑。
您的腳本執行良好,但它寫入
test.log
目前目錄中呼叫的文件。由於您從不cd
在腳本中,因此從技術上講,目前目錄在任何地方,但它很可能是使用者的主目錄。要寫入
test.log
位於其他位置,或者寫入cd
腳本中的正確目錄,或者test.log
在重定向到文件時提供文件的完整路徑。另請注意,您正在對輸出文件進行許多不必要的重定向。如果您的語句的所有輸出
if
都應附加到日誌文件中,您不妨這樣做if ...; then ... elif ...; then ... else ... if >>/path/to/test.log
這會將
if
語句中的所有輸出重定向到文件。或者,如果腳本的所有輸出都應該重定向到日誌文件,您也可以從 crontab 重定向
0 * * * * bash /usr/local/bin/test.sh >>/path/to/test.log
(一些 crontab 支持
@hourly
作為寫作的捷徑,0 * * * *
順便檢查man 5 crontab
一下你的系統)。在將標準輸出重定向到文件後標記上
2>&1
以也重定向標準錯誤流(即... >/path/to/test.log 2>&1
)。此外,您
/bin/sh
在腳本的行中,但您從 crontab 顯式#!
執行腳本。bash
這令人困惑。據我所見,bash
您的腳本中沒有任何特定內容,因此要麼/bin/sh
從 crontab 執行它,要麼只使其可執行,並且不要在 crontab 的命令行上指定解釋器來執行它。我對你的劇本的看法:
#!/bin/sh now=$(date "+%d-%m-%Y - %H:%M") logfile=/usr/local/bin/test.log status=$( lynx -head -source 'https://example.com' | awk 'FNR == 1 { print $2 }' ) case $status in 503) systemctl restart mydaemon message='Daemon restarted, site was unavailable' ;; 200) message='Site is available' ;; *) message='Site status is unknown' esac printf '%s: %s (status=%s)\n' "$now" "$message" "$status" >>"$logfile"