내 스크립트(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/