Come faccio a silenziare completamente un cronjob su / dev / null /?


72

Sul mio Ubuntu-Desktop e sul mio debian-server ho uno script che deve essere eseguito ogni minuto (uno script che chiama il minuto-tic del mio browser nel mio spazio online ).

Il problema è che su derivati ​​debian cron si registra /var/log/syslogogni volta che viene eseguito. Alla fine vedo ripetuto il messaggio in cui è stato eseguito più volte /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)

So che per sopprimere l'output di un programma posso reindirizzarlo /dev/null, ad esempio per nascondere tutti i messaggi di errore e di avviso da un programma, posso creare una riga in crontab come questa

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

Ma vorrei eseguire un cronjob ed essere sicuro che tutto l'output o gli errori generati vengano reindirizzati a NULL, quindi non genera alcun messaggio in syslog e non genera alcun messaggio di posta elettronica


EDIT:
esiste una soluzione per reindirizzare i cron-log in un registro separato come proposto qui cambiando/etc/syslog.conf

Ma lo svantaggio è che poi TUTTO l'output di tutti i cronjob viene reindirizzato.

Posso in qualche modo reindirizzare un singolo cronjob a un file di registro separato? Preferibilmente configurabile all'interno del cron.hourlyfile stesso.


2
Puoi anche solo mettere MAILTO=""all'inizio del file cron. Questo eliminerà tutte le email. E non ho mai sentito parlare di un demone cron che invia l'output del lavoro a syslog (ma suppongo sia possibile).
Patrick,

@Patrick - questo disabiliterà tutto, che potrebbe essere OK, ma fai attenzione. Vedi il mio aggiornamento, puoi impostare più mAILTO.
slm

Sì, MAILTO=""poiché la prima riga del crontab impedirà qualsiasi email. Inoltre, utilizzare il trifecta completo sulle righe di comando se si sopprime tutto l'output. Tutti e 3 i tipi vengono reindirizzati da questa stringa: >/dev/null 2>&1 - Naturalmente, è possibile fare in modo che lo script includa scritture periodiche in un registro separato.
SDsolar,

Risposte:


119

Rendi la linea questa:

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

Questo catturerà sia STDOUT (1) che STDERR (2) e li invierà a /dev/null.

MAILTO

Puoi anche disabilitare l'e-mail impostando e quindi reimpostando MAILTO=""ciò che disabiliterà l'invio di qualsiasi e-mail.

Esempio

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

MAILTO="admin@somedom.com"
 * * * * *      root    /usr/local/sbin/myothercommand.sh

Messaggistica aggiuntiva

Spesso ricevi i seguenti tipi di messaggi in /var/log/syslog:

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

Queste sono semplicemente notifiche tramite cron che è stata eseguita una directory di cronjobs. Questo messaggio non ha nulla a che fare direttamente con questi lavori, invece proviene cronddirettamente dal demone. Non c'è davvero nulla che tu possa fare al riguardo, e ti incoraggio a non disabilitarli, dal momento che sono probabilmente l'unica finestra che hai sugli avvenimenti crondtramite i registri.

Se sono molto fastidiosi per te, puoi sempre indirizzarli verso un file di registro alternativo per farli uscire dal tuo /var/log/syslogfile, attraverso il /etc/syslog.conffile di configurazione per syslog.


@ rubo77 - puoi mostrare un esempio? Avrei bisogno di vedere cosa non funziona con questo. Google cerca
slm

Funziona con tutti gli output e le e-mail, ma genera comunque una linea per ogni cron-call in / var / log / syslog
rubo77

@ rubo77 - è quello che pensavo avresti potuto chiedere. Non puoi fermare quei messaggi, sono generati dal demone crond stesso.
slm

@ rubo77 - Sono consapevole del cambiamento /etc/syslog.conf, difficilmente lo considero un'alternativa. Questo cambierà semplicemente il file in cui vengono scaricati i log o puoi disabilitare completamente tutti i messaggi cron. Non c'è modo di fare quello che vuoi.
slm

1
@ rubo77 - l'unico modo in cui sarai in grado di fare quello che vuoi è se metti un grep -v ...dopo l'invocazione di crond.
slm

10

avere uno script che deve essere eseguito ogni minuto. Il problema è che cron registra su / var / log / syslog ogni volta che viene eseguito. Alla fine vedo ripetuto il messaggio che è stato eseguito più volte in / var / log / syslog

Dal momento che nulla di ciò che fai sembra fermarlo, vale la pena chiedere: che cos'è esattamente questo script e qual è esattamente il messaggio che vedi in syslog?

Se il suggerimento di slm non ha funzionato, ciò è dovuto al fatto che qualcosa si sta registrando direttamente su syslog - o cron, come sembra implicito in alcuni dei tuoi commenti, oppure il processo eseguito da cron. I messaggi inviati a syslog non provengono da stdin o stderr, quindi 2>&1&>non aiuteranno.

Potrebbe esserci un modo per configurare il comportamento dell'applicazione in questione, tranne per il fatto che non sappiamo di cosa si tratti.

Esiste sicuramente un modo per configurare la maggior parte delle implementazioni syslog contemporanee (ce ne sono diverse) per filtrare i messaggi in modo molto specifico. Ad esempio, se nel messaggio di registro viene utilizzato un tag univoco, è possibile scegliere come target. Ma ancora una volta, dal momento che non sappiamo nulla del particolare messaggio o di quale syslogd usi, allora non c'è nulla di specifico che possa essere raccomandato.

Il mio punto generale è che se non si desidera reindirizzare / filtrare i messaggi perché "questo reindirizzerà tutti i messaggi", è possibile perfezionare la tecnica di filtro. Il thread di errori del server che hai collegato menziona solo il filtro per struttura ( *.cron), ma puoi configurare filtri più specializzati di così.


Debian e Ubuntu hanno entrambi rsyslog disponibile. Su debian 5+ è il syslog predefinito, su Ubuntu è un'opzione, quindi dovrai installarlo. Per creare un filtro che gli obiettivi di un qualche tipo di contenuto specifico, collocare questo vicino alla parte superiore (vale a dire, prima di tutte le altre regole, ma dopo la configurazione generale, il modulo di carico, ecc) di /etc/rsyslog.conf. Il modo migliore per farlo non è di modificare rsyslog.confse stesso, ma di creare un file nella /etc/rsyslog.conf.d/directory, con il nome che inizia con due cifre che sono meno di 50, cioè /etc/rsyslog.conf.d/15-my-filter.conf. Puoi mettere lì qualcosa del genere:

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

Questo invierà il messaggio a /dev/null(o un registro separato se preferisci). Tuttavia, il messaggio verrà comunque passato attraverso le regole successive che lo inviano /var/log/syslog. Per evitare che:

& stop

Immediatamente dopo l'altra riga. Questo butta via tutto ciò che corrisponde alla regola precedente. In alternativa, per le regole a riga singola è possibile aggiungere solo stopalla fine di quella riga di regole.

È necessario riavviare rsyslogddopo aver modificato la configurazione (ad es. Sui sistemi systemd systemctl restart rsyslog):

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

HUP fa riavviare il demone stesso.


Per rsyslog ~è ora deprecato e dovrebbe essere sostituito da stop. Anche la posizione nel rsyslogd.conffile è importante. Quindi per rsyslog vorrei semplicemente usare :msg, contains, "/usr/bin/w3m -no-cookie" stop. E quindi riavviare sudo systemctl restart rsyslog.
Frank Breitling,

4

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

Di default la EXTRA_OPTSlinea è""


2

Il reindirizzamento per /dev/nullnascondere l'output dal comando. Se non lo fai, cron ti invia l'output. L'output del comando non finisce mai nei registri di sistema (almeno non per cronologia).

Di solito è una cattiva idea reindirizzare l'output /dev/null, in particolare l'output di errore: se qualcosa va storto, non si avranno informazioni per diagnosticare il problema. Se non si desidera ricevere un messaggio, reindirizzare a un file di registro.

Niente di tutto ciò è rilevante per il tuo problema. Il messaggio che citi proviene da cron stesso. Cron scrive una voce di registro ogni volta che esegue un lavoro. Nessuna implementazione cron che ho visto ti consente di utilizzare diverse configurazioni di registrazione per diversi lavori.

Se si desidera omettere alcuni lavori, l'unica opzione è applicare il filtro di testo ai messaggi di registro nel demone syslog. Lo standard di fatto per il filtro syslog è eseguire rsyslog (che può essere o meno il valore predefinito sul sistema) come demone syslog. Vedi la risposta di goldilocks su come filtrare questo particolare comando.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.