내 우분투 데스크탑과 데비안 서버에는 1 분마다 실행 해야하는 스크립트가 있습니다 (내 우주 온라인 브라우저 게임 의 미세한 요소를 호출하는 스크립트 ).
문제는 데비안 파생물에서 cron이 /var/log/syslog
실행될 때마다 로깅한다는 것입니다. 나는 그것이 반복적으로 실행 된 메시지를 반복해서 보았습니다 /var/log/syslog
.
Nov 11 16:50:01 eclabs /USR/SBIN/CRON[31636]: (root) CMD (/usr/bin/w3m -no-cookie http://www.spacetrace.org/secret_script.php > /dev/null 2>&1)
프로그램의 출력을 억제하기 위해 프로그램으로 리디렉션 할 수 있다는 것을 알고 있습니다. /dev/null
예를 들어 프로그램에서 모든 오류 및 경고 메시지를 숨기려면 crontab에 다음과 같이 줄을 만들 수 있습니다
* * * * * root /usr/local/sbin/mycommand.sh > /dev/null
그러나 cronjob을 실행하고 생성 된 모든 출력 또는 오류가 NULL로 파이프되도록하므로 syslog에 메시지를 생성하지 않으며 전자 메일을 생성하지 않습니다
편집 : 여기 에 제안 된 것처럼
cron-logs를 별도의 로그로 리디렉션하는 솔루션이 있습니다./etc/syslog.conf
그러나 단점은 모든 cronjob의 모든 출력이 리디렉션된다는 것입니다.
어떻게 든 단일 cronjob을 별도의 로그 파일로만 리디렉션 할 수 있습니까? cron.hourly
파일 자체 내에서 구성 할 수있는 것이 좋습니다.
답변
이 줄을 :
* * * * * root /usr/local/sbin/mycommand.sh > /dev/null 2>&1
STDOUT (1)과 STDERR (2)를 모두 캡처하여로 보냅니다 /dev/null
.
MAILTO
이메일을 설정하지 않은 다음 재설정하여 MAILTO=""
이메일 전송을 비활성화 할 수도 있습니다 .
예
MAILTO=""
* * * * * root /usr/local/sbin/mycommand.sh > /dev/null 2>&1
MAILTO="admin@somedom.com"
* * * * * root /usr/local/sbin/myothercommand.sh
추가 메시지
종종 다음과 같은 유형의 메시지가 나타납니다 /var/log/syslog
.
Nov 11 08:17:01 manny CRON[28381]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
이것은 cronjobs 디렉토리가 실행되었다는 cron을 통한 알림입니다. 이 메시지는 이러한 작업과 직접 관련이 없으며 대신 crond
데몬에서 직접 온 것입니다. 이것에 대해 실제로 할 수있는 일은 없으며 crond
, 로그 를 통해 진행되는 유일한 창 일 가능성이 있기 때문에 비활성화하지 않는 것이 좋습니다 .
그들이 당신을 매우 귀찮게하는 경우에 /var/log/syslog
대한 /etc/syslog.conf
구성 파일을 통해 파일에서 파일을 가져 오기 위해 항상 대체 로그 파일로 보낼 수 있습니다 syslog
.
답변
매분마다 실행해야하는 스크립트가 있습니다. 문제는 cron이 실행될 때마다 / var / log / syslog에 로깅한다는 것입니다. / var / log / syslog에서 반복적으로 ececuted 된 메시지가 반복되는 것을 보게됩니다.
무엇을 : 당신이 아무 것도이 중지 보인다 때문에, 물어 가치가 바로 이 스크립트이며, 무엇을 정확하게 당신이 syslog에 표시되는 메시지는?
slm의 제안이 효과가 없다면 이것은 syslog에 직접 로깅하는 것입니다-일부 의견에 암시 된 것처럼 cron 또는 cron이 실행하는 프로세스입니다. syslog로 전송 된 메시지는 stdin 또는 stderr에서 보내지 2>&1&>
않으므로 도움이되지 않습니다.
해당 응용 프로그램의 동작을 구성 할 수있는 방법이있을 수 있습니다.
메시지를 매우 구체적으로 필터링하도록 대부분의 최신 syslog 구현 (여러 개가 있음)을 구성 할 수있는 방법이 있습니다. 예를 들어, 로그 메시지에 고유 태그가 사용 된 경우이를 대상으로 지정할 수 있습니다. 그러나 다시 말하지만, 우리는 특정 메시지 또는 어떤 syslogd를 사용하는지 알지 못하므로 권장 할만한 것은 없습니다.
내 일반적인 요점은 “모든 메시지를 리디렉션합니다”라는 이유로 메시지를 리디렉션 / 필터링하지 않으려면 필터링 기술을 세분화 할 수 있다는 것입니다. 연결 한 서버 오류 스레드는 시설별 필터링 ( *.cron
) 만 언급 하지만 그보다 더 특수한 필터를 구성 할 수 있습니다 .
데비안과 우분투에는 rsyslog가 있습니다. 데비안 5 이상에서는 기본 syslog이고, 우분투에서는 옵션이므로 설치해야합니다. 특정 종류의 특정 콘텐츠를 대상으로하는 필터를 만들려면이 필터를 맨 위 근처 (예 : 다른 규칙 앞에 있지만 일반 구성, 모듈로드 등)에 두십시오 /etc/rsyslog.conf
. 이 작업을 수행하는 가장 좋은 방법은 rsyslog.conf
자체 를 편집하는 것이 아니라 /etc/rsyslog.conf.d/
이름이 50보다 작은 두 자리로 시작하는 디렉토리에 파일을 만드는 것 /etc/rsyslog.conf.d/15-my-filter.conf
입니다. 다음과 같은 것을 넣을 수 있습니다.
:msg, contains, "/usr/bin/w3m -no-cookie" /dev/null
메시지를 보내 /dev/null
거나 원하는 경우 별도의 로그 를 보냅니다 . 그러나 메시지는 계속해서 후속 규칙을 통해 메시지를 전달합니다 /var/log/syslog
. 이를 방지하려면 다음을 수행하십시오.
& stop
다른 줄 바로 다음에. 이것은 이전 규칙과 일치하는 것을 버립니다. 또는 한 줄 규칙 stop
의 경우 해당 규칙 줄 끝에 추가 하면됩니다.
rsyslogd
구성을 변경 한 후 다시 시작해야합니다 (예 : systemd systems systemctl restart rsyslog
).
kill -HUP $(cat /var/run/rsyslogd.pid)
HUP는 데몬 자체를 다시 시작합니다.
답변
변화 /etc/default/cron
# Or, to log standard messages, plus jobs with exit status != 0:
# EXTRA_OPTS='-L 5'
#
# For quick reference, the currently available log levels are:
# 0 no logging (errors are logged regardless)
# 1 log start of jobs
# 2 log end of jobs
# 4 log jobs with exit status != 0
# 8 log the process identifier of child process (in all logs)
#
EXTRA_OPTS="-L 0"
기본적으로 EXTRA_OPTS
라인은""
답변
/dev/null
명령에서 출력 을 숨기도록 리디렉션합니다 . 이 작업을 수행하지 않으면 cron이 출력을 메일로 보냅니다. 명령의 출력은 시스템 로그에서 끝나지 않습니다 (적어도 cron 이하 지 않음).
일반적으로 출력을로 /dev/null
, 특히 오류 출력 으로 리디렉션하는 것은 좋지 않습니다. 문제가 발생하면 문제를 진단 할 정보가 없습니다. 메일을받지 않으려면 로그 파일로 리디렉션하십시오.
그러나이 중 어느 것도 문제와 관련이 없습니다. 인용하는 메시지는 cron 자체에서 온 것입니다. Cron은 작업을 실행할 때마다 로그 항목을 작성합니다. 내가 본 cron 구현은 다른 작업에 대해 다른 로깅 구성을 사용할 수 없습니다.
일부 작업을 생략하려는 경우 유일한 옵션은 syslog 디먼의 로그 메시지에 텍스트 필터링을 적용하는 것입니다. syslog 필터링에 대한 사실상의 표준 은 syslog 데몬으로 rsyslog (시스템의 기본값이거나 아닐 수도 있음)를 실행하는 것입니다. 이 특정 명령을 필터링하는 방법 은 goldilocks의 답변 을 참조하십시오 .