Perché il mio lavoro cron.d al minuto non viene eseguito?


33

Ho lanciato un sacco di freccette cercando di ottenere una mia sceneggiatura in pitone da eseguire ogni minuto. Quindi ho pensato di semplificarlo per fare semplicemente "la cosa più semplice che potesse funzionare" una volta al minuto (sto eseguendo debian / testing).

Ho creato un file a riga singola in /etc/cron.d/perminute:

* * * * * /bin/touch /home/me/ding_dong

È di proprietà di root ed eseguibile (non sono sicuro se una di queste questioni). E poi ho fatto:

sudo service cron reload

E poi siediti e ricomincia a correre ls -ltrancora e ancora nella mia directory home ( /home/me). Ma il mio file ding_dong non viene mai visualizzato. So che se faccio un sudo /bin/touch /home/me/ding_dong, si presenta subito.

Ovviamente manca qualcosa di stupido qui.


3
Il ricaricamento del servizio demone cron per applicare una modifica in cron.d di solito non è necessario perché esegue comunque una nuova ricerca della directory per i file nuovi e aggiornati ogni minuto.
Josip Rodin,

Risposte:


45

Quando aggiungi una configurazione cron dentro /etc/cron.d/o dentro /etc/crontabdevi aggiungere il nome utente in quale contesto deve essere eseguito il comando, nel tuo esempio

* * * * * root /bin/touch /home/me/ding_dong

E solo un suggerimento da parte mia: non devi ricominciare a correre ls -ltrancora e ancora, basta usare watch -n 5 "ls -ltr"e eseguirà il comando ogni 5 secondi (o qualsiasi altro valore sostituendo 5 con quello che desideri).


9
Questo mi ha fatto andare nella direzione corretta. È stato un momento da capogiro. L'ho risolto, eppure non funzionava ancora. Dopo aver letto man cronun po 'più lentamente e prestando particolare attenzione alle DEBIAN specificsezioni, ho notato che i file NON devono essere di gruppo o altri scrivibili. Che avevo abilitato nella mia frustrazione ad un certo punto.
Travis Griggs,

Non potresti anche cambiare il proprietario dello script in root?
Geremia,

Questa linea specifica mi ha aiutato. Da man cron: Inoltre, in Debian, cron legge i file nella directory /etc/cron.d. cron tratta i file in /etc/cron.d allo stesso modo del file / etc / crontab (seguono il formato speciale di quel file, cioè includono il campo utente ). Tuttavia, sono indipendenti da / etc / crontab: ad esempio, non ereditano da esso le impostazioni della variabile di ambiente. Questa modifica è specifica per Debian, vedi la nota sotto DEBIAN SPECIFIC di seguito.
Harperville,

man 8 cron (su Debian) dice anche che i file in /etc/cron.d/ possono contenere solo caratteri alfanumerici, '-' e '_'. In particolare, nessun punto.
mpartel,

3

Per creare un nuovo cronlavoro, è necessario eseguire crontab -el'utente che si desidera eseguire il lavoro. Quindi aggiungere la riga pertinente nella finestra dell'editor che appare:

* * * * * /bin/touch /home/me/ding_dong

Il modo in cui lo fai richiede un formato diverso e non è comunque una buona idea. I crontab /etc/cron.dhanno un formato leggermente diverso, richiedono l'esecuzione di un nome utente. Per esempio:

* * * * * USERNAME /bin/touch /home/me/ding_dong

Un buon trucco (come suggerito da @VogonPoetLaureate) è quello di catturare l'errore standard dei tuoi lavori cron che può aiutarti a eseguirne il debug. Per esempio:

* * * * * /bin/touch /home/me/ding_dong 2>/tmp/error

6
Non c'è assolutamente alcun motivo per dire che cron.d "non è una buona idea". Il demone cron invierà correttamente l'output cron.d stderr al nome utente e, se si desidera reindirizzarlo a un altro indirizzo e-mail, la variabile MAILTO è disponibile.
Josip Rodin,

@JosipRodin non è una buona idea per cose non gestite da root e che sono state create da te. Ha senso per un amministratore di sistema su un sistema multiutente ma sulla propria macchina, è più semplice avere tutto nel proprio crontab, quindi c'è solo un posto dove controllare ed crontab -lelencare tutti i lavori cron.
terdon,

Ciò presuppone che sia davvero solo un cron job personale, cosa che l'OP non ha chiarito davvero - in generale, ci sono numerose applicazioni per cron job utente senza privilegi configurate tramite cron.d, come tenerle tutte in un posto nonostante il fatto che tu l'abbia benissimo utenti del servizio sequestrati, implementazione automatizzata è più semplice, ecc.
Josip Rodin,

@JosipRodin assolutamente. Ho assunto un sistema personale perché i) i sistemi aziendali sono fuori tema qui e ii) la domanda suggeriva un utente non esperto.
terdon,

OK, immagino di non averlo più letto a causa della confusione comune tra superutente e serverfault e siti unix SE :)
Josip Rodin,

2

Un possibile errore qui è come viene creato un file a riga singola . Dalla documentazione di Ubuntu :

... la riga ha cinque campi di data e ora, seguiti da un comando, seguito da un carattere di nuova riga .

Ad esempio, questo modo di creare non funziona:

printf "* * * * * /bin/touch /home/me/ding_dong" > /etc/cron.d/ding_dong
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.