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


72

내 우분투 데스크탑과 데비안 서버에는 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파일 자체 내에서 구성 할 수있는 것이 좋습니다.


2
MAILTO=""cron 파일의 시작 부분에 넣을 수도 있습니다. 모든 이메일이 표시되지 않습니다. 그리고 작업 출력을 syslog로 보내는 cron 데몬에 대해 들어 본 적이 없습니다 (그러나 가능하다고 생각합니다).
Patrick

@ 패트릭-모든 것을 비활성화 할 것입니다. 괜찮을 수도 있지만 알아 두십시오. 내 업데이트를 참조하십시오. 여러 mAILTO를 설정할 수 있습니다.
slm

예, MAILTO=""crontab의 첫 번째 줄은 모든 이메일을 차단합니다. 또한 모든 출력을 억제하는 경우 명령 행에서 전체 trifecta를 사용하십시오. 모든 3 가지 종류가이 문자열로 경로 재 지정됩니다 >/dev/null 2>&1 .
SDsolar 2018 년

답변:


119

이 줄을 :

* * * * *       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.


@ rubo77-예를 보여줄 수 있습니까? 이것으로 작동하지 않는 것을 볼 필요가 있습니다. 인터넷 검색에서이를 답변으로 설정합니다. cyberciti.biz/faq/disable-the-mail-alert-by-crontab-command
slm

이 모든 출력 및 이메일에 대한 작동하지만, 여전히 / var에 각 크론 통화에 대한 행을 생성 / / 시스템 로그 로그
rubo77

@ rubo77-그것이 당신이 요구했을지도 모른다고 생각한 것입니다. 이러한 메시지는 중지 할 수 없으며 crond 데몬 자체에서 생성됩니다.
slm

@ rubo77-나는 변화를 알고 있습니다 /etc/syslog.conf. 나는 이것을 대안으로 생각하지 않을 것입니다. 로그가 덤프되는 파일을 변경하거나 cron 메시지를 모두 완전히 비활성화 할 수 있습니다. 원하는 것을 할 수있는 방법이 없습니다.
slm

1
@ rubo77-당신이 원하는 것을 할 수있는 유일한 방법은 당신이 grep -v ...호출 한 후 를 넣는 것 crond입니다.
slm

10

매분마다 실행해야하는 스크립트가 있습니다. 문제는 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는 데몬 자체를 다시 시작합니다.


rsyslog의 ~경우 더 이상 사용되지 않으며로 대체해야합니다 stop. 또한 rsyslogd.conf파일 의 위치가 중요합니다. rsyslog의 경우 간단히 사용 :msg, contains, "/usr/bin/w3m -no-cookie" stop합니다. 그런 다음 다시 시작하십시오 sudo systemctl restart rsyslog.
Frank Breitling

4

변화 /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라인은""


2

/dev/null명령에서 출력 을 숨기도록 리디렉션합니다 . 이 작업을 수행하지 않으면 cron이 출력을 메일로 보냅니다. 명령의 출력은 시스템 로그에서 끝나지 않습니다 (적어도 cron 이하 지 않음).

일반적으로 출력을로 /dev/null, 특히 오류 출력 으로 리디렉션하는 것은 좋지 않습니다. 문제가 발생하면 문제를 진단 할 정보가 없습니다. 메일을받지 않으려면 로그 파일로 리디렉션하십시오.

그러나이 중 어느 것도 문제와 관련이 없습니다. 인용하는 메시지는 cron 자체에서 온 것입니다. Cron은 작업을 실행할 때마다 로그 항목을 작성합니다. 내가 본 cron 구현은 다른 작업에 대해 다른 로깅 구성을 사용할 수 없습니다.

일부 작업을 생략하려는 경우 유일한 옵션은 syslog 디먼의 로그 메시지에 텍스트 필터링을 적용하는 것입니다. syslog 필터링에 대한 사실상의 표준 은 syslog 데몬으로 rsyslog (시스템의 기본값이거나 아닐 수도 있음)를 실행하는 것입니다. 이 특정 명령을 필터링하는 방법 은 goldilocks의 답변 을 참조하십시오 .

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