Como eu silencio completamente um cronjob para / dev / null /?

65

No meu Ubuntu-Desktop e no meu debian-server eu tenho um script que precisa ser executado a cada minuto (um script que chama o minuto-tic do meu browsergame online do espaço ).

O problema é que, no derivado do Debian, o cron está logando em /var/log/syslog toda vez que ele é executado. Acabei vendo repetida a mensagem que foi executada repetidamente em /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)

Eu sei que, para suprimir a saída de um programa, posso redirecioná-lo para /dev/null , por exemplo, para ocultar todas as mensagens de erro e aviso de um programa, posso criar uma linha no crontab como esta

* * * * *       root    /usr/local/sbin/mycommand.sh > /dev/null

Mas eu gostaria de executar um cronjob e ter certeza de que todas as saídas ou erros gerados são canalizados para NULL, para que ele não gere nenhuma mensagem no syslog e não gere nenhum e-mail

EDIT:
existe uma solução para redirecionar os cron-logs para um log separado como proposto aqui alterando /etc/syslog.conf

Mas a desvantagem é que, então, TODA a saída de todos os cronjobs é redirecionada.

Posso de alguma forma apenas redirecionar um único cronjob para um arquivo de log separado? De preferência configurável dentro do próprio arquivo cron.hourly .

    
por rubo77 11.11.2013 / 06:46

4 respostas

108

Faça a seguinte linha:

* * * * *       root    /usr/local/sbin/mycommand.sh > /dev/null 2>&1

Isto irá capturar STDOUT (1) e STDERR (2) e enviá-los para /dev/null .

MAILTO

Você também pode desativar o e-mail configurando e redefinindo o MAILTO="" , o que desativará o envio de todos os e-mails.

Exemplo

MAILTO=""
* * * * *       root    /usr/local/sbin/mycommand.sh > /dev/null 2>&1

MAILTO="[email protected]"
 * * * * *      root    /usr/local/sbin/myothercommand.sh

Mensagens adicionais

Muitas vezes você recebe os seguintes tipos de mensagens em /var/log/syslog :

Nov 11 08:17:01 manny CRON[28381]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)

Estas são simplesmente notificações via cron que um diretório de cronjobs foi executado. Esta mensagem não tem nada a ver diretamente com essas tarefas, em vez disso, ela vem diretamente do daemon crond . Não há nada que você possa fazer sobre isso, e eu gostaria de encorajá-lo a não desabilitá-los, já que eles provavelmente são a única janela que você tem sobre as ocorrências de crond via logs.

Se eles são muito irritantes para você, você sempre pode direcioná-los para um arquivo de log alternativo para tirá-los do arquivo /var/log/syslog , através do arquivo de configuração /etc/syslog.conf para syslog .

    
por 11.11.2013 / 06:52
10

have a script which needs to be executed each minute. The problem is that cron is logging to /var/log/syslog each time it executes. I end up seeing repeated the message it was ececuted over and over in /var/log/syslog

Como nada parece pará-lo, vale a pena perguntar: o que exatamente é este script e o que exatamente é a mensagem que você vê no syslog?

Se a sugestão de slm não funcionou, isso ocorre porque algo está registrando no syslog diretamente - ou cron, como parece estar implícito em alguns de seus comentários, ou então o processo executado pelo cron. As mensagens enviadas para o syslog não vêm de stdin ou stderr, portanto, 2>&1&> não ajudará.

Pode haver uma maneira de configurar o comportamento do aplicativo em questão, exceto que não sabemos o que é.

Existe certamente uma maneira de configurar a maioria das implementações de syslog contemporâneas (existem várias) para filtrar mensagens de forma muito específica. Por exemplo, se houver uma tag exclusiva usada na mensagem de log, você poderá segmentar isso. Mas, novamente, uma vez que não sabemos nada sobre a mensagem em particular, ou qual syslogd você usa, então não há nada específico que possa ser recomendado.

Meu ponto geral é que, se você não quiser redirecionar / filtrar mensagens porque "isso redirecionará todas as mensagens", você poderá refinar a técnica de filtragem. O encadeamento de falha do servidor vinculado apenas menciona filtragem por facilidade ( *.cron ) - mas você pode configurar filtros mais especializados do que isso.

Debian e Ubuntu ambos têm rsyslog disponíveis. No debian 5+ é o syslog padrão, no ubuntu é uma opção, então você terá que instalá-lo. Para criar um filtro que segmente algum tipo de conteúdo específico, coloque este próximo ao topo (ou seja, antes de qualquer outra regra, mas após a configuração geral, carregamento do módulo, etc) de /etc/rsyslog.conf . A melhor maneira de fazer isso é não editar o rsyslog.conf em si, mas criar um arquivo no diretório /etc/rsyslog.conf.d/ , com o nome começando com dois dígitos menores que 50, ou seja, /etc/rsyslog.conf.d/15-my-filter.conf . Você pode colocar algo assim:

:msg, contains, "/usr/bin/w3m -no-cookie" /dev/null

Isso enviará a mensagem para /dev/null (ou um log separado, se você preferir). No entanto, a mensagem ainda será passada pelas regras subsequentes que a enviam para /var/log/syslog . Para evitar isso:

& stop

Imediatamente após essa outra linha. Isso joga fora qualquer coisa que corresponda à regra anterior. Ou, para regras de linha única, basta adicionar stop ao final dessa linha de regra.

Você precisa reiniciar rsyslogd depois de alterar a configuração (por exemplo, em sistemas systemd systemctl restart rsyslog ):

kill -HUP $(cat /var/run/rsyslogd.pid)

O HUP faz com que o daemon se reinicie.

    
por 11.11.2013 / 11:38
4

Alterar /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 é ""

    
por 15.08.2014 / 02:17
2

Redirecionando para /dev/null oculta a saída do comando. Se você não fizer isso, então o cron envia a saída para você. A saída do comando nunca acaba nos logs do sistema (pelo menos não pelo cron).

Geralmente é uma má idéia redirecionar a saída para /dev/null , especialmente a saída de erro: se algo der errado, você não terá nenhuma informação para diagnosticar o problema. Se você não quiser receber um email, redirecione para um arquivo de log.

Nada disso é relevante para o seu problema. A mensagem que você cita é do próprio cron. Cron escreve uma entrada de log toda vez que executa um job. Nenhuma implementação do cron que eu tenha visto permite que você use diferentes configurações de log para tarefas diferentes.

Se você quiser omitir alguns trabalhos, sua única opção é aplicar a filtragem de texto às mensagens de log no daemon syslog. O padrão de fato para filtragem de syslog é rodar rsyslog (que pode ou não ser o padrão em seu sistema) como o daemon syslog. Veja a resposta de goldilocks sobre como filtrar esse comando em particular.

    
por 12.11.2013 / 01:17