J'ai un programme qui imprime une sortie que j'aimerais afficher sur mon terminal une fois par heure pendant la journée de travail.
$ crontab -l
0 07-17 * * * /home/dat/scripts/cron.out
syslog rapporte ce qui suit:
(dat) CMD (/home/dat/scripts/cron.exe)
Jun 18 12:02:01 picard CRON[10848]: (CRON) info (No MTA installed, discarding output)
Qu'est-ce que je rate?
La mauvaise solution pourrait être de rediriger la sortie de votre programme vers le fichier pts d’un terminal déjà existant.
Pour connaître le fichier pts, tapez simplement la commande tty
~$ tty
/dev/pts/4
alors votre crontab serait:
0 07-17 * * * /home/dat/scripts/cron.out > /dev/pts/4
Une autre façon pourrait être de lancer le programme en tant qu'argument du terminal:
xfce4-terminal --command=/home/dat/scripts/cron.out --display=:0.0 -H
où display
est l'affichage X où vous souhaitez afficher le terminal, -H
indique au terminal de rester ouvert une fois la commande terminée. Cela créera à chaque fois un nouveau terminal.
crontab:
0 07-17 * * * /usr/bin/xfce4-terminal --display=:0.0 -H --command=/home/dat/scripts/cron.out
si l'affichage n'est pas présent, une erreur sera consignée par syslog.
Cron vous envoie par courrier électronique la sortie de votre script. Malheureusement, buntu ne configure pas le courrier local par défaut , c'est pourquoi Cron vous indique dans les journaux "Non MTA installé, annulation de la sortie".
Configurer le courrier local pourrait être un moyen de résoudre votre problème. Au lieu d'une sortie dans un terminal, vous recevez une notification par courrier électronique.
Si vous voulez que votre tâche cron soit transmise à un terminal, vous devez rediriger sa sortie vers le terminal. La partie redirection est facile -
0 07-17 * * * /home/dat/scripts/cron.out >/dev/pts/42 2>&1
mais le problème est de savoir quel terminal rediriger. Il n’ya pas de réponse universelle à cela, cela dépend de la manière dont vous voulez sélectionner le terminal parmi ceux auxquels vous êtes connecté.
Pour les utilisations typiques, une notification via l'interface graphique serait plus appropriée. Vous pouvez utiliser notify-send
. Vous aurez besoin de définissez la variable d'environnement DISPLAY
.
0 07-17 * * * DISPLAY=:0 notify-send "$(/home/dat/scripts/cron.out)"
Cron envoie la sortie à un mailer. Si vous voulez voir la sortie dans un terminal, vous pouvez vous connecter à un fichier et utiliser tail -f pour voir la sortie dans le terminal que vous voulez voir.
0 07-17 * * * /home/dat/scripts/cron.out > /path/to/log.txt 2> /path/to/error.txt
Autres façons de se connecter:
echo output > log.txt
, ou vous pouvez utiliser le script wrapper décrit ci-dessous.Exemple de programme et 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
Exemple d'exécution 1:
$ ./wrapper.sh 1 2 3 ; cat error.txt log.txt
sample error
arg 1=1 arg2=2 arg3=3
Exemple d'exécution 2:
$ ./wrapper.sh "A B C" D E ; cat error.txt log.txt
sample error
arg 1=A B C arg2=D arg3=E
Maintenant que vous enregistrez les erreurs standard et standard dans un fichier, dans n’importe quel terminal, vous pouvez exécuter tail -f
sur un ou les deux fichiers tels que tail -f log.txt
ou tail -f log.txt error.txt
, de sorte que tail surveillera ou suivra plutôt le ou les fichiers à modifier. page de garde
$ tail -f log.txt error.txt
==> log.txt <==
arg 1=1 arg2=2 arg3=3
==> error.txt <==
sample error
Fichiers de journalisation ajoutés après:
Si log.txt ou error.txt sont ajoutés ultérieurement à votre programme ou à un autre terminal tel que $ echo "more output" >> log.txt
, la sortie est visible sur le terminal exécutant $ tail -f log.txt error.txt
.
==> log.txt <==
more output
De plus, $ echo code red >> error.txt
résulte en:
==> error.txt <==
code red