크론 작업을 기록하는 방법?


218

각 실행에서 cron 작업이 수행하는 작업을 정확하게 볼 수있는 방법을 알고 싶습니다. 로그 파일은 어디에 있습니까? 또는 출력을 이메일로 보낼 수 있습니까? 크론 작업이 실행될 때 로그를 보내도록 전자 메일 주소를 설정했지만 아직 아무것도받지 못했습니다.


이 게시물을 살펴보십시오 : cron 작업으로 작성된 로그 파일 관리 .
codeforester

답변:


347
* * * * * myjob.sh >> /var/log/myjob.log 2>&1

cron 작업의 모든 출력을 /var/log/myjob.log에 기록합니다.

mail이메일을 보내는 데 사용할 수 있습니다 . 대부분의 시스템은 처리되지 않은 cron작업 출력을 전자 메일을 통해 루트 또는 해당 사용자 에게 보냅니다 .



5
이 로그 파일이 생성되지 않은 경우 무엇이 문제가 될 수 있습니까?
클램프

10
FWIW, 통나무 stderrstdout통나무를 모두 원한다면 다음 과 같은 2>&1지시를 myjob.sh >> /var/log/myjob.log 2>&1
따라야합니다

2
YYYY-MM-DD_hh-mm-sec출력 파일 이름 에 삽입 하여 모든 파일 이름이 다르고 다시 쓰지 않고 유지하는 방법은 무엇입니까?
Danijel

6
@Danijel serverfault.com/a/117365/193377 0 * * * /some/path/to/a/file.php> $ HOME / date +\%Y\%m\%d\%H\%M\%S-cron.log 2> & 1
AnneTheAgile

61

기본적으로 cron은 / var / log / syslog에 로그하므로 다음을 사용하여 cron 관련 항목을 볼 수 있습니다.

grep CRON /var/log/syslog

/ubuntu/56683/where-is-the-cron-crontab-log


2
우분투 12.04에서 기본값은 .log입니다. 즉 / var / log / syslog
tishma

5
사용 journalctl | grep cronsystemd 시스템
마이크로 소프트 리눅스 TM에게

2
/var/log/cronAWS Linux AMI에서.
Jonathan

2
또는sudo journalctl -u cron
Gianfranco P.

2
정확히 cron기록되는 위치는 시스템에 따라 다릅니다. Linux 시스템 (또는보다 정확하게는를 사용하는 시스템)에서 다양한 로깅 대상을 구성하는 방법에 대한 세부 정보가있는 별도의 답변이 있습니다 syslog. 다른 시스템은 이러한 것들을 구성하는 다른 방법을 가질 수 있습니다.
tripleee 2018 년

10

내 코드는 다음과 같습니다.

* * * * * your_script_fullpath >> your_log_path 2>&1

">>"는 파일 권리에 데이터를 추가한다는 의미입니까? "2> & 1"의 의미는 무엇입니까?
Nullpointer

3
기본 리디렉션 질문은 설명서에서 가장 잘 확인하십시오. 또한 스택 오버플로에서 이러한 연산자에 대한 중복 질문에 대한 메트릭 포터 제비가 있습니다. 그러나 그렇습니다. 표준 출력과 동일한 위치에 표준 오류를 보내라고 >>덧붙 2>&1입니다.
tripleee '23시

10

최소한 세 가지 유형의 로깅이 있습니다.

  1. 프로그램이 실행되기 전에 로깅은 명령을 실행하기 위해 cronjob이 TRIED 인 경우에만 로깅합니다. @Matthew Lock에서 이미 언급했듯이 / var / log / syslog에 있습니다.

  2. @Spliffster에서 언급 한 것처럼 프로그램이 실행을 시도한 후 오류 로깅은 전자 메일이나 파일로 보낼 수 있습니다. 전자 메일을 사용하면 새로운 문제의 원인이 있으며 전자 메일 보내기 및 수신이 완벽하게 작동하는지 확인하기 때문에 파일에 로깅하는 것이 좋습니다. 때로는 그렇지 않습니다. 예를 들어, smtp 구성에 관심이없는 간단한 일반 데스크탑 시스템에서는 때때로 파일에 로깅하는 것이 좋습니다.

     * * * *  COMMAND_ABSOLUTE_PATH > /ABSOLUTE_PATH_TO_LOG 2>&1
    
    • / ABSOLUTE_PATH_TO_LOG의 권한을 확인하고 해당 사용자의 권한에서 명령을 실행하는 것도 고려할 것입니다. 잠재적 인 문제의 원인이 될 수 있는지 테스트하는 동안 확인 목적으로 만 사용하십시오.
  3. 추적 목적으로 자체 오류 처리 및 로깅과 함께 프로그램 자체의 로깅.

cronjobs의 일반적인 문제 원인은 다음과 같습니다. * 실행할 바이너리의 절대 경로. 쉘에서 실행할 때 작동하지만 cron 프로세스는 다른 환경을 사용하는 것처럼 보이므로 절대 경로를 사용하지 않으면 항상 바이너리를 찾지는 않습니다. * 바이너리가 사용하는 라이브러리. 이전의 요점과 거의 같지만, 단순히 명령의 NAME을 입력하는 경우 매우 동일한 라이브러리를 사용하는 이진을 정확하게 참조하는지 또는 더 나은 경우 절대 경로를 참조하는 이진인지 확인하십시오. 콘솔을 직접 사용할 때 참조하는 것과 동일합니다. 다음과 같이 locate 명령을 사용하여 바이너리를 찾을 수 있습니다.

$locate python

참조 할 바이너리가 쉘에서 호출하는 바이너리와 동일해야합니다. 또는 cronjob에 넣을 절대 경로를 사용하여 쉘에서 다시 테스트하십시오.

  • 문제의 또 다른 일반적인 원인은 cronjob의 구문입니다. 목록 (쉼표), 범위 정의 (대시-), 범위 증분 정의 (슬래시) 등에 사용할 수있는 특수 문자가 있습니다. http://www.softpanorama.org/Utilities/ cron.shtml

8

우분투에서는 cron.log파일에 CRON 항목 만 포함 시킬 수 있습니다 .

파일에 언급 cron된 행의 주석 을 해제 /etc/rsyslog.d/50-default.conf하십시오.

#  Default rules for rsyslog.
#

#                       For more information see rsyslog.conf(5) and /etc/rsyslog.conf

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none          -/var/log/syslog
#cron.*                          /var/log/cron.log

파일을 저장하고 닫은 다음 rsyslog서비스 를 다시 시작하십시오 .

sudo systemctl restart rsyslog

이제 자체 파일에서 cron 로그 항목을 볼 수 있습니다.

sudo tail -f /var/log/cron.log

샘플 출력 :

Jul 18 07:05:01 machine-host-name CRON[13638]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)

그러나 스크립트가 cron.log (또는 다른 로그 파일)로 출력을 보내지 않는 한 실제로 /etc/cron.daily또는 /etc/cron.hourly에서 실행 된 스크립트에 대한 자세한 정보는 표시되지 않습니다 .

당신은 crontab을 실행중인 경우 확인하고 그것을 검색 할 필요가 없습니다하려는 경우 cron.log또는 syslog당신의 선택의 로그 파일에 출력을 리디렉션 crontab을 작성, - 뭔가를 같이를 :

# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
30 2 * * 1 /usr/local/sbin/certbot-auto renew >> /var/log/le-renew.log 2>&1

단계 : https://www.cyberciti.biz/faq/howto-create-cron-log-file-to-log-crontab-logs-in-ubuntu-linux/


우분투 16.04는 크론 로그를 표시하지 않았 으며이 정보는 트릭을 수행했습니다.
pojda

5

cron 이미 메일로 실행하는 모든 작업의 ​​표준 출력 및 표준 오류를 크론 작업 소유자에게 보냅니다.

당신은 사용할 수 있습니다 MAILTO=recipient에서 crontab다른 계정으로 보낸 이메일을 가지고 파일.

제대로 작동하려면 메일이 제대로 작동해야합니다. 로컬 사서함으로 배달하는 것은 일반적으로 문제가되지 않습니다 (사실, ls -l "$MAIL"이미 일부 항목을 받았을 가능성이 있음). MTA (Postfix, Sendmail, What you)가 필요합니다. 세상에 연결되도록 올바르게 구성하십시오.

출력이 없으면 이메일이 생성되지 않습니다.

일반적으로 출력을 파일로 리디렉션하는 것이 좋습니다.이 경우 cron 데몬은 작업이 출력을 반환하지 않습니다. 변형은 표준 출력을 파일로 리디렉션하거나 스크립트를 작성하여 아무것도 인쇄하지 않습니다. 데이터베이스에 결과를 저장하거나 단순히 아무것도 출력하지 않는 유지 관리 작업을 수행합니까?)있는 경우에만 전자 메일을 수신합니다 오류 메시지입니다.

두 출력 스트림을 리디렉션하기 위해 구문은 다음과 같습니다.

42 17 * * * script >>stdout.log 2>>stderr.log

>>덮어 쓰기 대신 (double ) 을 추가 하여 이전 작업의 출력이 다음 작업으로 대체되지 않도록하십시오.

많은 답변에서 제안한 것처럼 두 출력 스트림을 단일 파일로 보낼 수 있습니다. 두 번째 리디렉션을 2>&1"표준 출력이 어디로 가든지 표준 오류가 발생해야합니다"로 바꾸십시오 . (그러나 나는이 관행을 특별히 보증하지는 않습니다. 실제로 표준 출력에서 ​​아무것도 기대하지 않지만 스크립트에서 호출 된 외부 도구에서 오는 것을 간과했을 수 있습니다.)

cron작업은 홈 디렉토리에서 실행되므로 상대 파일 이름은 상대 디렉토리 이름이어야합니다. 홈 디렉토리 외부에 쓰려면 분명히 해당 대상 파일에 대한 쓰기 액세스 권한이 있는지 확인해야합니다.

일반적인 안티 패턴은 모든 것을 리다이렉션하는 것입니다 /dev/null(그리고 무언가가 작동하지 않을 때 무엇이 ​​잘못되었는지 알아 내기 위해 Stack Overflow를 요청하십시오; 그러나 우리는 손실 된 출력도 볼 수 없습니다!)

스크립트 내에서 정기적 인 출력 (실제 결과, 이상적으로는 기계가 읽을 수있는 형태)과 진단 (보통 사람이 읽을 수있는 형식)을 별도로 유지하십시오. 쉘 스크립트에서

echo "$results"  # regular results go to stdout
echo "$0: something went wrong" >&2

일부 플랫폼 (예 : GNU Awk)에서는 /dev/stderr오류 메시지에 파일 이름을 사용할 수 있지만 이것은 이식성이 떨어집니다. 펄, warndie표준 오류에 인쇄; 파이썬, 쓰기에서 sys.stderr, 또는 사용 logging; 루비에서 시도하십시오 $stderr.puts. 또한 오류 메시지에 진단 메시지를 생성 한 스크립트 이름이 어떻게 포함되어야하는지 주목하십시오.


1

sudo를 사용하여 명령을 실행하는 경우 허용되지 않습니다. Sudo는 tty가 필요합니다.


4
sudo구성에 따라 다릅니다 . 암호를 제공 할 방법없이 실행해야하는 것은 구성 NOPASSWD:에서 sudoers구성 해야 합니다.
tripleee

0

여전히 cron 작업을 확인하려면 cPanel에서 Cron 작업을 설정할 때 유효한 이메일 계정을 제공해야합니다.

유효한 이메일을 지정하면 실행되는 크론 작업의 출력이 수신됩니다. 따라서이를 확인하고 모든 것이 올바르게 실행되었는지 확인할 수 있습니다. cron job 명령에서 출력이 없으면 이메일을받지 않습니다.

실행 된 각 cron 작업에 대한 이메일을 받게됩니다. 크론이 너무 자주 실행되는 경우받은 편지함이 넘칠 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.