컬이 있는 스크립트는 수동으로 실행할 수 있지만 크론 작업에서는 실행할 수 없습니다.

컬이 있는 스크립트는 수동으로 실행할 수 있지만 크론 작업에서는 실행할 수 없습니다.

내 스크립트(status.sh)는 다음과 같습니다.

#!/bin/bash
SITE=http://www.example.org/

STATUS=$(/usr/bin/curl -s -o /dev/null -I -w "%{http_code}" $SITE)

if [ $STATUS -eq 200 ]
then
 echo $STATUS >> /home/myuser/mysite-up.log
else
 echo $STATUS >> /home/myuser/mysite-down.log
fi

난 달린다:

$ chmod +x /home/myuser/status.sh

그런 다음 내 crontab에서 다음을 얻습니다.

* * * * * /home/myuser/status.sh

내가 실행할 때 :

$ /home/myuser/status.sh

이 파일 /home/myuser/mysite-up.log에는 다음이 포함됩니다.

200

그러나 cron이 실행되면 파일에는 다음이 /home/myuser/mysite-up.log포함됩니다.

000

내가 뭘 잘못했나요?

편집하다: 다음을 추가하도록 스크립트를 수정했습니다.

set -x

@Sobrique가 제안한 대로 내 결과는 다음과 같습니다.

 SITE=http://www.example.org/
 /usr/bin/curl -s -o /dev/null -I -w '%{http_code}' http://www.example.org/
 STATUS=000
 '[' 000 -eq 200 ']'
 echo 000

답변1

명령줄에서 스크립트를 실행하는 것과 cron에서 실행하는 것의 주요 차이점은 환경입니다. 다른 동작이 발생하는 경우 해당 동작이 환경 변수로 인해 발생한 것인지 확인하세요. 크론 작업은 몇 가지 변수가 설정된 경우에만 실행되며 이러한 변수는 로그인 세션의 값과 반드시 ​​동일하지는 않습니다(특히 PATH서로 다른 경우가 많습니다).

환경 변수를 설정하려면 에서 선언하거나 ~/.pam_environment(시스템이 지원하는 경우) . ~/.profile &&cron 작업 시작 부분에 추가합니다(에서 선언하는 경우 .profile). 당신은 또한 볼 수 있습니다환경 변수를 설정하는 가장 좋은 distro/shell 독립적 방법은 무엇입니까?

이 경우 000컬의 상태는 서버에 연결할 수 없음을 나타냅니다. 일반적으로 네트워크 연결은 시스템 전체에 걸쳐 이루어지므로 cron의 네트워킹은 동일하게 작동합니다. 그러나 환경 변수가 나타내는 한 가지는 프록시를 사용한다는 것입니다. 네트워크에 연결하기 위해 프록시가 필요하고 http_proxy세션 시작 스크립트에 환경 변수를 설정한 경우 해당 설정은 cron 작업에 적용되지 않으며 이로 인해 실패가 발생할 수 있습니다.

-S호출 에 오류 메시지를 표시하는 옵션을 추가합니다 ( 다른 메시지는 숨겨 curl집니다 ).-s

답변2

cron에서 사용하는 컬은 터미널/셸에서 사용되는 컬과 다를 수 있습니다. 전체 경로를 사용하는 which curl대신 터미널(작동 중인 곳)을 확인한 다음 cron 또는 cron 이 호출한 쉘 스크립트에서 직접 확인하세요 .curl https://www.example.com//home/myusername/anaconda3/bin/curl https://www.example.com/

관련 정보