일반적으로 크론 작업이 중단되면 로그에 일부 오류 메시지가 남습니다.
우리는 cron 작업을 사용하여 쉘 스크립트와 일부 Java 프로그램을 실행합니다. 최근 우리는 로그에서 이상한 점을 발견했습니다. 분명히 프로그램이 초기화될 때 설정한 프로그램 잠금이 있었고 해제되지 않았기 때문에 프로그램이 충돌하거나 종료되었습니다. 프로그램 로그에 완료 메시지가 표시되지 않아 프로그램이 종료된 것으로 추측하고 있습니다.
누가 일을 종료할 수 있나요? 크론 작업이 종료되면 이메일을 통해 어떻게 알림을 받나요?
편집: 나는 모든 표준 출력을 이메일로 푸시하기 때문에 이메일을 받기 위해 crontab 방법을 사용하고 싶지 않습니다. 내 경우에는 다른 프로그램의 다른 시스템 출력이 많이 있었습니다. 그 중 일부는 log4j를 사용하지 않았거나 쉘 스크립트에 의해 에코되었기 때문입니다. 시스템에는 많은 사용자가 있으므로 모든 사용자에게 프로그램의 표준 출력을 관리하도록 요구할 수는 없습니다.
답변1
시스템 로그를 확인하세요. 확인할 로그는 기본 설정을 사용하는 Debian 설치에 따라 다릅니다.
- 에서는
/var/log/auth.log
작업에 PAM 세션이 포함되므로 cron 작업이 시작되고 완료될 때 이를 알립니다. - 에
/var/log/syslog
, 언급했습니다grandchild #32283 failed with exit status 1
. /var/log/kern.log
OOM 킬러에 의해 프로세스가 종료된 경우 첨부된 알림입니다.
cron 작업이 표준 출력 또는 표준 오류에 대한 출력을 생성하는 경우 (로컬 메일 전달 시스템이 올바르게 설정되지 않은 경우 제외) cron에서 이메일을 받게 됩니다. 메시지가 0이 아닌 상태를 자동으로 반환하는 경우(신호에 의해 종료된 경우 포함) 메시지를 받을 수 없습니다. 알림을 원하면 오류가 발생할 때 소음을내는 쉘 래퍼를 준비하십시오.
42 1 * * * /path/to/real/job || echo $?
프로세스와 프로세스가 어떻게 종료되는지(및 프로세스가 어떻게 탄생하는지에 대한 자세한 정보를 기록하고 싶지만 여기에서 이미 알고 있음)를 참조하세요.현재 닫힌 과거 스레드의 로그가 있습니까?
답변2
이것을 디버깅하려면 다음을 넣을 수 있습니다.
set -e -u
쉘 스크립트 상단에 위치 - 명령이 실패하거나 정의되지 않은 변수를 사용하면 오류 종료 상태로 종료됩니다.
그런 다음 아래와 같이 기본 스크립트를 호출하는 cron-job에서 래퍼 스크립트를 호출할 수 있습니다.
sh -x main_script.sh || echo Failed with exit status: $?
각 -x
줄은 실행 전에 인쇄됩니다. 출력은 cron 데몬에 의해 메일로 전송됩니다.
출력이 너무 큰 경우 임시 파일을 사용할 수도 있습니다.
sh -x main_script.sh > $TEMPFILE 2>&1
if [ $? -ne 0 ]; then echo Failed with exit status $? - see $TEMPFILE; fi
종료 상태가 > 128
신호에 의해 명령이 중단된 경우(예: 누군가 명령을 "종료"했거나 분할 오류가 발생했거나 메모리 부족 상태가 발생함)종료 상태에서 신호를 받는 방법).