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/syslog
cada 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.hourly
próprio arquivo.
fonte
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).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.Respostas:
Faça a linha assim:
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
Mensagens adicionais
Muitas vezes, você recebe os seguintes tipos de mensagens em
/var/log/syslog
: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
crond
diretamente 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 entrarcrond
nos 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/syslog
arquivo, através do/etc/syslog.conf
arquivo de configuração parasyslog
.fonte
/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.grep -v ...
após a chamada docrond
.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 orsyslog.conf
arquivo, 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: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:Imediatamente depois dessa outra linha. Isso descarta qualquer coisa que corresponda à regra anterior. Ou, para regras de linha única, você pode simplesmente adicionar
stop
ao final dessa linha de regras.Você precisa reiniciar
rsyslogd
após alterar a configuração (por exemplo, nos sistemas systemdsystemctl restart rsyslog
):O HUP faz com que o daemon seja reiniciado.
fonte
~
Agora, o rsyslog está obsoleto e deve ser substituído porstop
. Também é importante a posição norsyslogd.conf
arquivo. Então, para o rsyslog, eu simplesmente usaria:msg, contains, "/usr/bin/w3m -no-cookie" stop
. E depois reiniciesudo systemctl restart rsyslog
.mudança
/etc/default/cron
Por padrão, a
EXTRA_OPTS
linha é""
fonte
Redirecionar para
/dev/null
ocultar 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.
fonte