Debian 8.1에서는 Bash 기능을 사용 하여 stackoverflow.com 웹 사이트에 연결할 수 있는지 여부를 감지하고 있습니다.
(에코 > /dev/tcp/stackoverflow.com/80 ) &> / dev / null || echo "stackoverflow에 연결할 수 없음"
이것은 Bash 전용이며 sh
의 기본 셸인 에서는 작동하지 않습니다 cron
.
의도적으로에서 스크립트를 시도하면 다음 sh
과 같은 결과가 나타납니다.
$ /bin/sh: 1: cannot create /dev/tcp/stackoverflow.com/80: Directory nonexistent
나는 단지 (설정하지 않고 내 개인의 crontab에 다음을 넣어 따라서, 만약 SHELL
을 /bin/bash
통해) crontab -e
, I는 분당되면, 스크립트가 실행 될 것으로 기대하고, 또한 분에 한 번씩 메일을 당 전송 위의 오류에 그래서 저는 기대합니다 :
* * * * * (에코> /dev/tcp/stackoverflow.com/80) &> / dev / null || echo "stackoverflow에 연결할 수 없음"
실제로 예상대로 정확히 /var/log/syslog
항목이 분당 한 번 실행되는 것을 볼 수 있습니다 .
# sudo grep stackoverflow / var / log / syslog 8 월 24 일 18:58:01 localhost CRON [13719] : (매트) CMD ((echo> /dev/tcp/stackoverflow.com/80) &> / dev / null || echo "stackoverflow unreachable") Aug 24 18:59:01 localhost CRON [13723] : (mat) CMD ((echo> /dev/tcp/stackoverflow.com/80) &> / dev / null || echo "stackoverflow unreachable ") 8 월 24 일 19:00:01 localhost CRON [13727] : (매트) CMD ((echo> /dev/tcp/stackoverflow.com/80) &> / dev / null || echo"stackoverflow unreachable ") .. .
지난 2 시간 동안 이미 120 번 이상 실행되었습니다 wc -l
. 출력을 .
그러나 셸 명령 (반복하려면 : 셸 명령이 유효하지 /bin/sh
않음)이 120 번 이상 실행되었으므로 세 개의 전자 메일 만 받았습니다 .
첫 번째는 19:10:01, 두 번째는 20:15:01, 세 번째는 20:57:01입니다.
세 메일의 내용은 모두 예상대로 정확하게 읽히고 호환되지 않는 쉘에서 스크립트를 실행할 때 예상되는 오류 메시지를 정확히 포함합니다 (의도). 예를 들어, 내가받은 두 번째 메일은 읽습니다 (다른 두 메일은 사실상 동일합니다).
발신자 : [email protected] 월 8 월 24 일 월요일 20:15:01 2015 발신자 : [email protected] (Cron 데몬) 수신자 : [email protected] 제목 : Cron (echo> /dev/tcp/stackoverflow.com/80) &> / dev / null || echo "stackoverflow unreachable" ... / bin / sh : 1 : /dev/tcp/stackoverflow.com/80을 만들 수 없습니다 : 디렉토리가 존재하지 않습니다`
에서 /var/log/mail.log
, 나는이 세 가지 메일이 있다고 볼 수 있는 유일한 지난 시간에주고받은 메일.
따라서 잘못된 스크립트에 의해 생성 된 위의 출력으로 인해 cron에서 수신 할 것으로 예상되는 100 개 이상의 추가 메일은 어디에 있습니까?
요약:
/usr/bin/sendmail
.위의 관찰로 이어진 명백한 실수를 해결하는 방법에는 여러 가지가 있습니다.
SHELL=/bin/bash
내에서 crontab
.heartbeat.sh
with #!/bin/bash
를 만들고 호출 할 수 있습니다 ./bin/bash -c ...
내 crontab
.sh
.그러나이 모든 것이이 질문의 핵심 문제를 해결 cron
하지 못합니다. 이 경우 스크립트가 항상 출력을 생성 하더라도 메일을 안정적으로 보내지 않습니다 .
스크립트가 항상 다음을 생성하여 출력을 생성하는지 확인했습니다 wrong.sh
(이는 의도적 으로 부적절한 /bin/sh
셸을 사용하여 cron
표시되어야 하는 동일한 오류를 생성 함).
#! / bin / sh (에코> /dev/tcp/stackoverflow.com/80) &> / dev / null || echo "stackoverflow에 연결할 수 없음"
이제 루프에서 스크립트를 호출하고 출력 을 생성 하지 않고 완료되는 경우가 있는지 확인할 수 있습니다. Bash 사용 :
$ 사실이지만; do [[-n $ (./ wrong.sh 2> & 1)]]; 에코 $ ?; 완료 | grep -v 0
수천 번의 호출에서도 스크립트가 출력을 생성하지 않고 완료되는 경우를 재현 할 수 없습니다.
이 예측할 수없는 행동의 원인은 무엇일까요? 누구든지 이것을 재현 할 수 있습니까? 나에게는 cron이 스크립트의 출력을 놓칠 수있는 경쟁 조건이있을 수 있으며, 아마도 주로 셸 자체에서 오류가 발생하는 경우를 포함 할 수 있습니다. 감사합니다!
추가 테스트에서 &
결과가 엉망 이라고 생각합니다 . 당신이 지적으로, &>/dev/null
이다 bash는 구문이 아닌 쉬 구문. 결과적 sh
으로은 (는) 서브 쉘을 생성하고 배경 화합니다. 물론, subshell echo
은 stderr을 생성하지만 내 이론은 다음과 같습니다.
|| echo ...
.... 크론 작업에 출력이 없으므로 메일이 없습니다. vixie-cron 소스를 읽었을 때 작업의 stderr 및 stdout이 cron에 의해 캡처되는 것처럼 보이지만 subshell에 의해 손실되어야합니다.
/ bin / sh 환경에서 직접 테스트하십시오 (여기에 'bar'라는 파일이 없다고 가정).
(grep foo bar) &
echo $?
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다