Como silenciar completamente um cronjob para / dev / null /?

72

No meu Ubuntu-Desktop e no meu servidor debian, eu tenho um script que precisa ser executado a cada minuto (um script que chama os minutos do meu espaço online no jogo ).

O problema é que, nos derivativos debian, o cron está registrando /var/log/syslogcada vez que é executado. Acabo 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 toda a saída ou erros gerados sejam canalizados para NULL, para que não gere nenhuma mensagem no syslog e nem gere e-mails


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, em seguida, TODA a saída de todos os cronjobs é redirecionada.

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

rubo77
fonte
2
Você também pode colocar MAILTO=""no início do arquivo cron. Isso suprimirá todos os emails. E nunca ouvi falar de um daemon cron que envia a saída do trabalho para o syslog (mas acho que é possível).
11113 Patrick
@ Patrick - que desabilitará tudo, o que pode ser bom, mas fique atento. Veja minha atualização, você pode definir vários mAILTO's.
slm
Sim, MAILTO=""como a 1ª linha do crontab impedirá qualquer email. Além disso, use o trifecta completo em suas linhas de comando, se você estiver suprimindo toda a saída. Todos os três tipos são redirecionados por esta sequência: >/dev/null 2>&1 - Obviamente, você pode fazer com que o script inclua gravações periódicas em um log separado.
precisa saber é o seguinte

Respostas:

119

Faça a linha assim:

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

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

MAILTO

Você também pode desativar o email configurando e redefinindo o MAILTO=""que desativará o envio de qualquer email.

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 de que um diretório de cronjobs foi executado. Esta mensagem não tem nada a ver diretamente com esses trabalhos; em vez disso, vem cronddiretamente do daemon. Não há realmente nada que você possa fazer sobre isso, e eu encorajo você a não desabilitá-lo, já que provavelmente é a única janela que você tem para entrar crondnos logs.

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

slm
fonte
@ rubo77 - você pode mostrar um exemplo? Eu precisaria ver o que não está funcionando com isso. Googling transforma isso como a resposta: cyberciti.biz/faq/disable-the-mail-alert-by-crontab-command
SLM
Isso funciona para todas as saídas e-mails, mas ainda gera uma linha para cada cron-call em / var / log / syslog
rubo77
@ rubo77 - foi sobre isso que pensei que você poderia estar perguntando. Você não pode parar essas mensagens, elas são geradas pelo próprio daemon crond.
slm
@ rubo77 - Estou ciente da mudança /etc/syslog.conf, dificilmente consideraria isso uma alternativa. Isso mudará apenas o arquivo no qual os logs são despejados ou você poderá desativar completamente as mensagens cron. Não há como fazer o que você deseja.
slm
11
@ rubo77 - a única maneira de você conseguir fazer o que deseja é colocar um grep -v ...após a chamada do crond.
slm
10

tem um script que precisa ser executado a cada minuto. O problema é que o cron está efetuando logon em / var / log / syslog toda vez que é executado. Acabo vendo repetida a mensagem que foi executada repetidamente em / var / log / syslog

Como nada que você faça parece impedir isso, vale a pena perguntar: o que exatamente é esse script e qual é exatamente a mensagem que você vê no syslog?

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

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

Certamente existe uma maneira de configurar a maioria das implementações de syslog contemporâneas (existem várias) para filtrar as mensagens de maneira muito específica. Por exemplo, se houver uma tag exclusiva usada na mensagem de log, você poderá segmentá-la. Mas, novamente, como não sabemos nada sobre a mensagem específica ou qual syslogd você usa, não há nada específico que possa ser recomendado.

Meu argumento geral é que, se você não deseja redirecionar / filtrar mensagens porque "isso redirecionará todas as mensagens", é possível refinar a técnica de filtragem. O encadeamento de falhas do servidor ao qual você vinculou menciona apenas a filtragem por facilidade ( *.cron) - mas você pode configurar filtros mais especializados do que isso.


O Debian e o Ubuntu têm o rsyslog disponível. No debian 5+ é o syslog padrão, no ubuntu é uma opção, então você terá que instalá-lo. Para criar um filtro que tenha como alvo algum tipo de conteúdo específico, coloque-o próximo ao topo (ou seja, antes de outras regras, 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.confarquivo, mas criar um arquivo no /etc/rsyslog.conf.d/diretório, 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 subseqüentes que a enviam /var/log/syslog. Para impedir isso:

& stop

Imediatamente depois dessa outra linha. Isso descarta qualquer coisa que corresponda à regra anterior. Ou, para regras de linha única, você pode simplesmente adicionar stopao final dessa linha de regras.

Você precisa reiniciar rsyslogdapós alterar a configuração (por exemplo, nos sistemas systemd systemctl restart rsyslog):

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

O HUP faz com que o daemon seja reiniciado.

Cachinhos Dourados
fonte
~Agora, o rsyslog está obsoleto e deve ser substituído por stop. Também é importante a posição no rsyslogd.confarquivo. Então, para o rsyslog, eu simplesmente usaria :msg, contains, "/usr/bin/w3m -no-cookie" stop. E depois reinicie sudo systemctl restart rsyslog.
Frank Breitling
4

mudança /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 EXTRA_OPTSlinha é""

Dallas
fonte
2

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

Geralmente, é uma má idéia redirecionar a saída /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 deseja receber um email, redirecione para um arquivo de log.

No entanto, nada disso é relevante para o seu problema. A mensagem que você cita é do próprio cron. Cron grava uma entrada de log toda vez que executa uma tarefa. Nenhuma implementação cron que eu vi permite que você use configurações de log diferentes para trabalhos diferentes.

Se você deseja 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 a filtragem de syslog é executar o rsyslog (que pode ou não ser o padrão no seu sistema) como o daemon syslog. Veja a resposta de goldilocks para saber como filtrar esse comando específico.

Gilles 'SO- parar de ser mau'
fonte