[unix] cronjob을 / dev / null /에 완전히 침묵 시키려면 어떻게해야합니까?

내 우분투 데스크탑과 데비안 서버에는 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의 답변 을 참조하십시오 .


답변