Bash

我的腳本沒有按照 cron 計劃執行

  • August 6, 2019

我已經(在 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"

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