Cron은 가끔 출력 및 오류에 대한 이메일을 보냅니다.

매트

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 개 이상의 추가 메일은 어디에 있습니까?

요약:

  1. 이 시스템에서 메일이 올바르게 구성되어 있으므로 문제없이 메일을주고받을 수 있습니다 /usr/bin/sendmail.
  2. Cron이 올바르게 설정되고 예상대로 작업을 인식하고 구성된 시간에 정확하게 실행합니다. 다른 많은 작업과 예약 옵션을 시도해 보았고 cron은 모두 예상대로 정확하게 실행했습니다.
  3. 스크립트는 항상 출력 (아래 참조)을 작성하므로 cron이 각 호출에 대해 메일을 통해 출력을 나에게 보낼 것으로 예상합니다.
  4. 출력은 나에게 가끔씩 만 우편으로 발송되며 대부분의 경우 무시됩니다.

위의 관찰로 이어진 명백한 실수를 해결하는 방법에는 여러 가지가 있습니다.

  1. 나는 설정할 수 있습니다 SHELL=/bin/bash내에서 crontab.
  2. heartbeat.shwith #!/bin/bash를 만들고 호출 할 수 있습니다 .
  3. 나는 함께 스크립트를 호출 할 수 있습니다 /bin/bash -c ...crontab.
  4. 등, 모두 .NET 내에서 Bash 관련 기능을 사용하는 실수를 수정합니다 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을 생성하지만 내 이론은 다음과 같습니다.

  1. cron이 서브 쉘의 stderr를 잡지 못하고
  2. 서브 쉘의 배경 화는 항상 성공적으로 완료되므로 || echo ....

... 크론 작업에 출력이 없으므로 메일이 없습니다. vixie-cron 소스를 읽었을 때 작업의 stderr 및 stdout이 cron에 의해 캡처되는 것처럼 보이지만 subshell에 의해 손실되어야합니다.

/ bin / sh 환경에서 직접 테스트하십시오 (여기에 'bar'라는 파일이 없다고 가정).

(grep foo bar) &
echo $?

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Drupal 메일은 한 번에 1000 개 이상의 이메일을 보냅니다.

분류에서Dev

Apigee BaaS가 이상한 오류 메시지를 이메일로 보냅니다.

분류에서Dev

rm에 대한 호출을 가로 채고 삭제 된 파일을 대신 휴지통으로 보냅니다.

분류에서Dev

VIM의 일부 bash 명령은 VIM 대신 bash로 출력을 보냅니다.

분류에서Dev

Exim4가 루트에서 이상한 이메일을 보냅니다.

분류에서Dev

MediaPlayer가 로그에 출력하는 메시지 및 오류 처리에 대한 Android 설명서가 있습니까?

분류에서Dev

R에서 함수 seq (1,10) 및 seq (1:10)은 동일한 출력을 가지며 왜 함수 mean (1,10) 및 mean (1:10)에 대해 다른 출력이 있습니까?

분류에서Dev

Cron 프로세스는 이메일을 보냅니다.이 이메일은 어디에 있습니까?

분류에서Dev

CombineLatest 및 엄격한 입력 오류- "이 호출과 일치하는 오버로드가 없습니다."

분류에서Dev

Python Sklearn "ValueError : 분류 메트릭은 다중 클래스 다중 출력 및 이진 대상의 혼합을 처리 할 수 없습니다."오류

분류에서Dev

깔끔한 출력 테이블 및 Stargazer

분류에서Dev

REST API 함수에 대한 각 호출 그룹에 대해 하나의 이메일 만 보냅니다.

분류에서Dev

REST API 함수에 대한 각 호출 그룹에 대해 하나의 이메일 만 보냅니다.

분류에서Dev

cron : MTA 대신 syslog에 오류를 보냅니다.

분류에서Dev

이 명령 및 출력에 SHA1 및 SHA256을 추가합니다. 또한 파일이 서명되었거나 서명되지 않은 경우

분류에서Dev

, 참조 및 숨은 참조에서 중복 이메일을 제거하여 그리드를 보냅니다.

분류에서Dev

그룹에 사용자 이름을 추가 한 후 그룹 및 그룹 USERNAME에 대한 다른 출력

분류에서Dev

Spring MVC 및 POST의 리디렉션은 URL에 대상 파일을 보냅니다.

분류에서Dev

Laravel은 스토리지에 쓰는 대신 로깅을 위해 이메일을 보냅니다.

분류에서Dev

strlen은 { '1', '1'} 및 { '1', '1', '\ 0'}에 대해 동일한 출력을 어떻게 제공합니까?

분류에서Dev

파이썬 매트릭스에 대한 오류 및 출력 문제?

분류에서Dev

AJAX 및 양식 제출을 중단하고 저장하고 변경 한 다음 나중에 보냅니다.

분류에서Dev

keras 및 tf.keras의 ResNet 모델은 동일한 이미지에 대해 다른 출력을 제공합니다.

분류에서Dev

rsync와 동기화하면 이름에 점 및 기타 기호가있는 디렉토리에 대해 "잘못된 인수 (22)"오류가 출력됩니다.

분류에서Dev

크론 작업은 한 번에 하나의 이메일 만 보냅니다.

분류에서Dev

`at` 및`cron` 작업의 출력은 어디에 있습니까?

분류에서Dev

열에서 텍스트를 찾고 찾은 경우 이메일을 한 번만 보냅니다.

분류에서Dev

매번 동일한 메시지 및 공개 키에 대해 다른 출력을 생성하는 JSEncrypt

분류에서Dev

jQuery 단일 제출은 동일한 URL에 두 개의 요청을 보냅니다.

Related 관련 기사

  1. 1

    Drupal 메일은 한 번에 1000 개 이상의 이메일을 보냅니다.

  2. 2

    Apigee BaaS가 이상한 오류 메시지를 이메일로 보냅니다.

  3. 3

    rm에 대한 호출을 가로 채고 삭제 된 파일을 대신 휴지통으로 보냅니다.

  4. 4

    VIM의 일부 bash 명령은 VIM 대신 bash로 출력을 보냅니다.

  5. 5

    Exim4가 루트에서 이상한 이메일을 보냅니다.

  6. 6

    MediaPlayer가 로그에 출력하는 메시지 및 오류 처리에 대한 Android 설명서가 있습니까?

  7. 7

    R에서 함수 seq (1,10) 및 seq (1:10)은 동일한 출력을 가지며 왜 함수 mean (1,10) 및 mean (1:10)에 대해 다른 출력이 있습니까?

  8. 8

    Cron 프로세스는 이메일을 보냅니다.이 이메일은 어디에 있습니까?

  9. 9

    CombineLatest 및 엄격한 입력 오류- "이 호출과 일치하는 오버로드가 없습니다."

  10. 10

    Python Sklearn "ValueError : 분류 메트릭은 다중 클래스 다중 출력 및 이진 대상의 혼합을 처리 할 수 없습니다."오류

  11. 11

    깔끔한 출력 테이블 및 Stargazer

  12. 12

    REST API 함수에 대한 각 호출 그룹에 대해 하나의 이메일 만 보냅니다.

  13. 13

    REST API 함수에 대한 각 호출 그룹에 대해 하나의 이메일 만 보냅니다.

  14. 14

    cron : MTA 대신 syslog에 오류를 보냅니다.

  15. 15

    이 명령 및 출력에 SHA1 및 SHA256을 추가합니다. 또한 파일이 서명되었거나 서명되지 않은 경우

  16. 16

    , 참조 및 숨은 참조에서 중복 이메일을 제거하여 그리드를 보냅니다.

  17. 17

    그룹에 사용자 이름을 추가 한 후 그룹 및 그룹 USERNAME에 대한 다른 출력

  18. 18

    Spring MVC 및 POST의 리디렉션은 URL에 대상 파일을 보냅니다.

  19. 19

    Laravel은 스토리지에 쓰는 대신 로깅을 위해 이메일을 보냅니다.

  20. 20

    strlen은 { '1', '1'} 및 { '1', '1', '\ 0'}에 대해 동일한 출력을 어떻게 제공합니까?

  21. 21

    파이썬 매트릭스에 대한 오류 및 출력 문제?

  22. 22

    AJAX 및 양식 제출을 중단하고 저장하고 변경 한 다음 나중에 보냅니다.

  23. 23

    keras 및 tf.keras의 ResNet 모델은 동일한 이미지에 대해 다른 출력을 제공합니다.

  24. 24

    rsync와 동기화하면 이름에 점 및 기타 기호가있는 디렉토리에 대해 "잘못된 인수 (22)"오류가 출력됩니다.

  25. 25

    크론 작업은 한 번에 하나의 이메일 만 보냅니다.

  26. 26

    `at` 및`cron` 작업의 출력은 어디에 있습니까?

  27. 27

    열에서 텍스트를 찾고 찾은 경우 이메일을 한 번만 보냅니다.

  28. 28

    매번 동일한 메시지 및 공개 키에 대해 다른 출력을 생성하는 JSEncrypt

  29. 29

    jQuery 단일 제출은 동일한 URL에 두 개의 요청을 보냅니다.

뜨겁다태그

보관