내 스크립트가 cron 일정에 따라 실행되지 않습니다.

내 스크립트가 cron 일정에 따라 실행되지 않습니다.

웹 애플리케이션이 사용 가능한지 확인하고 웹 애플리케이션 데몬을 다시 시작하여 다시 실행되도록 하는 스크립트(Stack Exchange의 도움을 받아)를 만들었습니다(보통 작업을 시작하기 전에 도움이 됩니다). 매 시간마다 실행되어야 합니다.

다음 줄을 추가했습니다 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파일은 매시간 업데이트되지 않으므로 스크립트가 실행되지 않을 것 같습니다. 로그 항목을 수동으로 생성하려면 스크립트를 실행하세요.

답변1

crontab은 로그인 쉘과 다른 환경에서 스크립트를 실행합니다. 특히 PATH는 다르거나 정의되지 않을 수 있습니다.

명령(lynx, head...)에 절대 경로를 사용해 보십시오. 다음을 사용하여 얻을 수 있습니다.

which <command>

또한 test.log에 대한 경로를 지정해야 합니다.

답변2

스크립트는 정상적으로 실행되지만 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/shcrontab 에서 명시적으로 #!스크립트를 실행합니다 . bash이것은 매우 혼란스럽습니다. 내가 아는 한, bash스크립트에는 특별한 내용이 없으므로 crontab에서 실행하거나 /bin/sh실행 가능하게 만들고아니요이를 실행하려면 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"

관련 정보