Ottenere output da un cron job sul terminale


15

Ho un programma che stampa alcuni output che vorrei far apparire sul mio terminale una volta ogni ora durante la giornata lavorativa.

$ crontab -l
0 07-17 * * * /home/dat/scripts/cron.out

syslog riporta quanto segue:

(dat) CMD (/home/dat/scripts/cron.exe)
Jun 18 12:02:01 picard CRON[10848]: (CRON) info (No MTA installed, discarding output)

Cosa mi sto perdendo?


i lavori cron non dovrebbero scrivere su un terminale - potrebbe non essercene nessuno disponibile.
Guntbert,

Risposte:


14

Il modo sporco potrebbe essere il reindirizzamento dell'output del programma sul file pts di un terminale già esistente .

Per conoscere il file pts basta digitare ttycommand

~$ tty
/dev/pts/4

allora il tuo crontab sarebbe:

0 07-17 * * * /home/dat/scripts/cron.out > /dev/pts/4

Un altro modo potrebbe essere quello di avviare il programma come argomento del terminale:

xfce4-terminal --command=/home/dat/scripts/cron.out --display=:0.0 -H

dove si displaytrova il display X in cui si desidera mostrare il terminale, -Hè dire al terminale di rimanere aperto dopo che il comando è terminato. Questo creerà ogni volta un nuovo terminale.

crontab:

0 07-17 * * * /usr/bin/xfce4-terminal --display=:0.0 -H --command=/home/dat/scripts/cron.out

se il display non è presente, si avrà un errore registrato da syslog.


6

Cron ti invia l'output del tuo script. Sfortunatamente, Ubuntu non imposta la posta locale per impostazione predefinita , motivo per cui Cron ti dice nei registri "Nessun MTA installato, eliminando l'output".

L'impostazione della posta locale potrebbe essere un modo per risolvere il tuo problema. Invece di un output in un terminale, riceveresti una notifica via email.

Se vuoi che il tuo lavoro cron venga emesso su un terminale, dovrai reindirizzare il suo output sul terminale. La parte di reindirizzamento è semplice -

0 07-17 * * * /home/dat/scripts/cron.out >/dev/pts/42 2>&1

ma il problema è capire a quale terminale reindirizzare. Non esiste una risposta universale a ciò, dipende da come si desidera selezionare il terminale tra quelli a cui si è effettuato l'accesso.

Per usi tipici, una notifica della GUI sarebbe più appropriata. È possibile utilizzare notify-send. Dovrai impostare la DISPLAYvariabile di ambiente .

0 07-17 * * * DISPLAY=:0 notify-send "$(/home/dat/scripts/cron.out)"

2

Cron invia l'output a un mailer. Se si desidera visualizzare l'output in un terminale, è possibile accedere a un file e utilizzare tail -f per visualizzare l'output nel terminale in cui si desidera visualizzare l'output


Accedi a un file

  • La risposta più semplice è accedere direttamente a un file con una voce crontab come:

0 07-17 * * * /home/dat/scripts/cron.out > /path/to/log.txt 2> /path/to/error.txt

Modi alternativi per accedere:

  • Se il programma è uno script in cui è possibile scrivere, è possibile modificarlo per reindirizzare l'output in un file di registro con. echo output > log.txtoppure puoi usare a wrapper script descritto di seguito.
  • Se il tuo programma è binario o altrimenti non scrivibile, devi scrivere lo script wrapper per acquisire l'output in un file.

Esempio di programma e script wrapper:

$ cat program.sh wrapper.sh 
#!/bin/bash
# sample program
echo "arg 1=$1 arg2=$2 arg3=$3"
echo "sample error" >&2 

#!/bin/bash
# sample wrapper
exec ./program.sh "$@" >log.txt 2> error.txt

Esempio di esecuzione 1:

$ ./wrapper.sh 1 2 3 ; cat error.txt  log.txt 
sample error
arg 1=1 arg2=2 arg3=3

Esempio di esecuzione 2:

$ ./wrapper.sh "A B C" D E ; cat error.txt log.txt 
sample error
arg 1=A B C arg2=D arg3=E

Visualizza output nel terminale:

Ora che si registra sia un errore standard che un errore standard in un file, in qualsiasi terminale, è possibile eseguire tail -funo o entrambi i file come tail -f log.txto tail -f log.txt error.txtcosì che tail controllerà o piuttosto seguirà il file per le modifiche. man-page di coda

$ tail -f log.txt  error.txt
==> log.txt <==
arg 1=1 arg2=2 arg3=3

==> error.txt <==
sample error

Registrazione dei file aggiunti in seguito:

Se successivamente log.txt o error.txt vengono aggiunti dal tuo programma o da un altro terminale simile $ echo "more output" >> log.txt, l'output viene visualizzato sul terminale in esecuzione$ tail -f log.txt error.txt

==> log.txt <==
more output

Inoltre, si $ echo code red >> error.txttraduce in:

==> error.txt <==
code red
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.