Come faccio ad aggiungere una voce al mio crontab?


13

Sto usando crontab per la prima volta. Vuoi scrivere alcune attività cron di test molto semplici ed eseguirle.

$crontab * * * * * echo "Hi"

non produce nulla.

crontab */1 * * * * echo "hi"

dice */1: No such file or directory.

Inoltre, come posso elencare le attività cron attualmente in esecuzione (non solo quelle che possiedo, ma anche quelle avviate da altri utenti come root).

E come posso eliminare una particolare attività cron?


Per istruzioni su come modificare e creare processi cron e una spiegazione sulla struttura dei file, consultare questa guida alla sintassi di crontab
KJS,

Risposte:


21

Non puoi usare crontabcosì. Utilizzare man crontabper leggere il modo corretto di chiamare questa utility.

Ti consigliamo crontab -edi modificare le voci cron dell'utente corrente (puoi aggiungere / modificare / rimuovere le righe). Utilizzare crontab -lper visualizzare l'elenco corrente di attività configurate.

Per quanto riguarda la visualizzazione dei crontab di altri utenti, ciò non è possibile senza essere root nelle installazioni predefinite. Vedi Come posso elencare tutti i lavori cron per tutti gli utenti per alcuni modi per elencare tutto (come root).

Nota: fai molta attenzione quando usi i caratteri globbing della shell sulla riga di comando ( *e ?specialmente). *verrà espanso nell'elenco dei file nella directory corrente, che può avere effetti imprevisti. Se vuoi passare *come argomento a qualcosa, citalo ( '*').


quindi faccio crontab -e e nell'editor inserisco la voce * / 1 * * * * echo "ciao" e quando salvo questo file, vedo il messaggio che crontab: installazione di nuovo crontab. ma non vedo i messaggi di saluto che appaiono sullo schermo. Cosa mi sto perdendo adesso? Grazie.
xyz,

2
L'output di crontab non passerà mai al tuo "schermo". Dalla pagina man POSIX per crontab: "Se l'output standard e l'errore standard non vengono reindirizzati dai comandi eseguiti dalla voce crontab, qualsiasi output generato o errore verrà inviato all'utente, tramite un metodo dipendente dall'implementazione,".
Mat

1
L'output del lavoro verrà inviato alla casella di posta locale del proprietario del lavoro. (Running maildalla riga di comando dovrebbe accedere alla vostra casella di posta locale, se configurato.) Per vedere il 'ciao' in ambiente grafico, è possibile impostare l'attività come: * * * * * export DISPLAY=:0; xmessage 'hi'.
arte

@manatwork Potrebbe anche essere necessario XAUTHORITY, che potrebbe non essere facile .
derobert,

7

Esistono due modi per modificare uno crontab:

  1. interattivamente, usando crontab -e, che si aprirà crontabnell'editor specificato da $VISUALo $EDITOR, o

  2. in modo non interattivo, utilizzando crontab crontab.txt, che importerà semplicemente le crontabvoci dal file crontab.txt, sostituendo il crontab attivo esistente per l'utente corrente.

Il problema che hai è che stai semplicemente usando il crontabcomando sbagliato.


Quanto segue riguarda la manipolazione crontab non interattiva:

Quindi, per rimuovere determinate attività a livello di codice, potresti fare qualcosa del genere

$ crontab -l | grep -v 'PATTERN' >crontab.txt && crontab crontab.txt

dove si PATTERNtrova un'espressione regolare che corrisponderà alle attività che desideri rimuovere. Qui, crontab -lti darà la tua corrente crontab.

Oppure, se hai voci in un file chiamato crontab-fragment.txtche desideri rimuovere dal crontab attivo,

$ crontab -l | grep -v -Fx -f crontab-fragment.txt >crontab.txt && crontab crontab.txt

Questo legge l'attuale crontab e filtra (rimuove) qualsiasi riga presente anche nel file crontab-fragment.txtnella directory corrente (usando un confronto di stringhe di riga completa). Il risultato viene salvato crontab.txte quindi caricato da lì per sostituire l'attuale crontab.

Per aggiungere una o più attività , fai qualcosa di simile

$ crontab -l | cat - crontab-fragment.txt >crontab.txt && crontab crontab.txt

Ciò presuppone che il file crontab-fragment.txtcontenga le voci che si desidera aggiungere. Legge l'attuale crontab, aggiunge le voci crontab-fragment.txta questo e crea crontab.txt. Il crontab.txtfile sostituisce quindi il crontab corrente.


2

Se si desidera modificare il crontab in modo interattivo, eseguire il comando crontab -e, senza altra opzione. Questo avvierà un editor su una copia del crontab; quando si esce dall'editor , la copia modificata diventerà il nuovo crontab. È possibile controllare quale editor viene avviato tramite le variabili di ambiente VISUALeEDITOR . Per elencare il tuo crontab, esegui crontab -l.

Se si desidera modificare il crontab in uno script, impostare VISUALe EDITORil percorso di uno script o di uno snippet di shell che modifica il file fornito in posizione. L'editor edè una possibilità qui, o sed -ise l'implementazione di sedha questa opzione. Se si desidera aggiungere incondizionatamente una riga, è possibile utilizzare echo … >>. Abbi cura di citare; in caso di dubbio, scrivere una sceneggiatura e passare il nome della sceneggiatura come EDITOR.

script=$(mktemp)
cat <<'EOF' >"$script"
#!/bin/sh
ed -s "$1" <<'EOS'
g/^ *[^= ][^ =]*  *[^= ][^ =]*  *[^= ][^ =]*  *[^= ][^ =]*  *[^= ][^ =]*  *echo "hi"$/d
$a
* * * * * echo "hi"
.
w
q
EOS
EOF

2

È un po 'tardi, ma per gli altri che guardano qui. Esistono modi più semplici rispetto alla manipolazione dei flussi di input / output con VISUALe EDITOR.

Puoi semplicemente scrivere il tuo programma cron in un file, 1 lavoro per riga e usare il comando in crontab [filename]modo da poter inserire i cattuoi lavori filenamecome parte del tuo script e infine chiamare crontab alla fine, se vuoi.

in effetti questo è l'uso più comune come man crontabsuggerimenti elencandolo per primo


2

Se desideri aggiungere voci crontaball'automazione o dalla riga di comando, puoi farlo (impostando i tempi che desideri avere)

echo "* * * * * /yourpath/yourcommand 2>&1 >> /var/log/somelog.log" >> /var/spool/cron/root (or appropriate username)

Poi:

service crond reload

per ricaricare i crontab.


Questo è insostituibile; non tutti i file unix archiviano i file crontab in /var/spool/cron. Un modo migliore sarebbe attraverso il crontab(1)comando.
thrig

Questo può essere vero, ma era per mostrare il principio di come puoi farlo su un sistema, e sì, crontab fa il trucco se vuoi aggiungere riga per riga. Non intendeva essere una risposta assoluta, ma una se sai dove sono le tue cose e devi aggiungere in massa. Prendilo per quello che è.
Chris Sprucefield,

1

Provalo con questo comando:

crontab -e 

quindi aggiungi il tuo cron job:

*/1 * * * * echo "hi"

in quel file.


0

Vorrei evidenziare il modo in cui descrivo di seguito, anche se è stato menzionato in precedenza in un altro commento. L'ho trovato estremamente utile quando si aggiungono le voci a un file e quindi si aggiunge il file a crontab. Quel file conterrebbe le due voci seguenti e il nome del file sarebbe hello-world-crontab.txt.

  • 0 09 * * * echo "Hello world!" >> /home/user/greeting.txt
  • 0 09 * * * python /home/user/greeting.py

Quindi, ho eseguito il comando seguente per aggiungere queste voci al crontab.

  • $ crontab hello-world-crontab.txt

Il prossimo passo è verificare che queste voci siano state aggiunte.

  • $ crontab -l

Una breve spiegazione di ciò che fa ogni voce:

  • Questa voce di crontab scrive "Ciao mondo!" nel file /home/user/greeting.txtogni giorno alle 9 del mattino.
    • 0 09 * * * echo "Hello world!" >> /home/user/greeting.txt
  • Questo crontab esegue un file Python che viene stampato nella riga di comando "Ciao mondo!" tutti i giorni alle 9 del mattino.
    • 0 09 * * * python /home/user/greeting.py
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.