Como posso impedir que o cron preencha meu syslog?

31

Eu tenho um script que precisa ser executado a cada minuto. O problema é que o cron está conectado a /var/log/syslogcada vez que é executado. Acabo vendo algo assim repetido várias vezes em /var/log/syslog:

Jun 25 00:56:01 myhostname /USR/SBIN/CRON[1144]: (root) CMD (php /path/to/script.php > /dev/null)

Estou usando o Debian.

Minhas perguntas são: Existe alguma maneira de dizer ao cron para não gravar essas informações no syslog toda vez?

user7321
fonte
11
Alguma idéia de como fazer isso em uma plataforma Busybox? O formato do /etc/syslog.conf é diferente ...
Mark Lakata 15/13

Respostas:

25

Você pode enviar a saída do cron para um recurso de log separado e adicionar o seguinte ao seu /etc/syslog.confarquivo:

# Log cron stuff
cron.*                                                  /var/log/cron

Lembre-se de adicionar /var/log/cronao seu /etc/logrotate.d/syslogpara garantir que ele seja girado, por exemplo

# /etc/logrotate.d/syslog
/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron {
    sharedscripts
    postrotate
    /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}
Dave Cheney
fonte
Obrigado pela contribuição. Eu adicionei cron. * / Var / log / cron e reiniciei o cron, mas continua despejando as mensagens em / var / log / syslog enquanto deixa / var / log / cron vazio. não tenho certeza por que ele não está fazendo nada
user7321
11
oh cara, falha épica da minha parte. Eu estava editando syslog.conf e reiniciando o cron !! Não admira que não iria funcionar .. Eu deveria ter sido reiniciar syslog =)
user7321
11
A ativação do cron.log não impede que mensagens cron sejam gravadas no syslog.
basic6
16

Está bem,

A solução para minha pergunta foi:

mudança

*.*;auth,authpriv.none     -/var/log/syslog

para

*.*;cron,auth,authpriv.none     -/var/log/syslog

dentro /etc/syslog.confe, em seguida, reinicie o syslog

Também tenho o cron sendo enviado /var/log/cron.logconforme sugerido por Dave Cheney e colado um logrotate nele. Minha correção com a sugestão de Daves é ideal para minha situação porque:

  1. ele evita /var/log/syslogser confuso com mensagens cron
  2. Ainda recebo mensagens cron (o que é bom para solucionar problemas)
  3. logrotate evita /var/log/cron.logir muito grande.
user7321
fonte
7
Para aqueles preocupados com sistemas modernos, existe um rsyslogno Debian 8.0 Jessie, então é o que /etc/rsyslog.confdeve ser editado. A propósito, as strings a serem adicionadas já estão lá por padrão, você precisa apenas descomentá-las (linha 63). E /var/log/cron.logjá está no /etc/logrotate.d/syslog, assim como os mantenedores de pacotes leram este tópico.
TranslucentCloud
Sua pergunta foi Is there any way I can tell cron not write this information to syslog every time. Esta não é a resposta.
ntd
@TranslucentCloud Só queria acrescentar que minha configuração do rsyslog no ubuntu 14 LTS estava no /etc/rsyslog.d/50-default.conf.
Johnny
8

Altere / 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"

Por padrão, a linha EXTRA_OPTS é ""

dfc
fonte
Este IMO é a solução correta: não gere o registro de log.
ntd 17/12/16
4

No Ubuntu 14.04.5 (e provavelmente em outro lugar), existe o rsyslogd em vez do syslogd. O TranslucentCloud sugeriu isso com o Debian Jessie, mas a mesma solução (mas alterar o rsyslog.conf em vez do syslogd.conf) não parece funcionar no Ubuntu.

Parece que os valores definidos no /etc/rsyslog.d/50-default.conf terão precedência sobre os itens definidos no /etc/rsyslog.conf, portanto, é melhor fazer as alterações e reiniciar o rsyslog e o cron. Caso contrário, você ainda terminará com o comportamento padrão de registrar o cron no syslog, além de registrar o cron no cronlog (mas não exclusivamente).

Primeiras linhas no meu /etc/rsyslog.d/50-default.conf:

*.*;cron,auth,authpriv.none     -/var/log/syslog
cron.*                          /var/log/cron.log

E pronto!

ericus
fonte
11
Resposta muito boa. Dito isso, você pode se concentrar em perguntas mais recentes para participação futura no Stack Overflow, pois essa é extremamente antiga.
Magellan
3

Eu apenas resolvi isso de uma maneira diferente, mas meu objetivo era um pouco diferente. Eu queria descartar as entradas do cron que foram geradas quando o atrun foi acionado para que meus discos rígidos pudessem dormir e não serem acordados a cada 5 minutos.

Você pode fazer com que o destino de um evento de log no syslog.conf seja um comando shell, prefixando-o com o pipe e, portanto, usei o grep para jogar fora os que não queria. Tão:

cron.*              | grep -v "(/usr/libexec/atrun)" >> /var/log/cron.log

Não investiguei, mas acredito que deve ser possível enviar essas entradas de log para outro destino, se elas ainda forem desejadas.

Parakleta
fonte
3

Na verdade, a solução 'melhor' (alguém poderia afirmar) é uma combinação do que o @DaveCheney sugeriu e o que o user7321 fez eventualmente , além de uma terceira ação que eu recomendaria:

  1. Impedindo o syslogd de anexar mensagens de log relacionadas ao cron em / var / log / syslog
  2. Garantir que as mensagens do log do cron sejam registradas em algum lugar (especificamente, em / var / log / cron) + garantir a rotação do log do cron.
  3. Impedindo o syslogd de anexar mensagens de log relacionadas ao cron em / var / log / messages também

No seu caso /etc/syslog.conf, a combinação dessas sugestões muda algo como o seguinte:

*.*;cron,auth,authpriv.none                         -/var/log/syslog
auth,authpriv.none;daemon.none;mail,news.none       -/var/log/messages

para dentro:

cron.*                                              /var/log/cron.log
*.*;cron,auth,authpriv.none                         -/var/log/syslog
auth,authpriv.none;cron,daemon.none;mail,news.none  -/var/log/messages

E não se esqueça de recarregar à força (ou reiniciar) os serviços cron e syslogd, por exemplo, usando:

/etc/init.d/syslogd force-reload
/etc/init.d/cron force-reload

Nota: Isso funciona com o rsyslogd também.

einpoklum - restabelece Monica
fonte
A melhor solução é o que o @dfc sugeriu, ou seja, não gere o log em primeiro lugar.
ntd 17/12/16