Ausgabe von einem Cron-Job auf dem Terminal erhalten

15

Ich habe ein Programm, das einige Ausgaben druckt, die ich einmal pro Stunde während des Arbeitstages auf meinem Terminal anzeigen möchte.

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

Syslog meldet Folgendes:

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

Was vermisse ich?

user168328
quelle
Cron-Jobs sollten nicht auf ein Terminal schreiben - möglicherweise ist keines verfügbar.
guntbert

Antworten:

14

Der schmutzige Weg könnte darin bestehen, die Ausgabe Ihres Programms in die pts-Datei eines bereits vorhandenen Terminals umzuleiten .

Um die pts-Datei zu kennen, geben Sie einfach ttycommand ein

~$ tty
/dev/pts/4

dann wäre dein crontab:

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

Eine andere Möglichkeit könnte darin bestehen, das Programm als Argument des Terminals zu starten:

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

Wo displaysich das X-Display befindet, auf dem Sie das Terminal anzeigen möchten, -Hsoll das Terminal anweisen, geöffnet zu bleiben, nachdem der Befehl beendet wurde. Dadurch wird jedes Mal ein neues Terminal erstellt.

crontab:

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

Wenn die Anzeige nicht vorhanden ist, wird ein Fehler von syslog protokolliert.

Artix
quelle
6

Cron sendet Ihnen eine E-Mail mit der Ausgabe Ihres Skripts. Leider richtet Ubuntu standardmäßig keine lokalen E-Mails ein , weshalb Cron Ihnen in den Protokollen mitteilt, dass kein MTA installiert ist und die Ausgabe verworfen wird.

Das Einrichten lokaler E-Mails kann eine Möglichkeit sein, Ihr Problem zu lösen. Anstelle einer Ausgabe in einem Terminal erhalten Sie eine E-Mail-Benachrichtigung.

Wenn Sie möchten, dass Ihr Cron-Job auf einem Terminal ausgegeben wird, müssen Sie seine Ausgabe auf das Terminal umleiten . Der Weiterleitungsteil ist einfach -

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

Das Problem besteht jedoch darin, herauszufinden, zu welchem ​​Terminal umgeleitet werden soll. Darauf gibt es keine allgemeingültige Antwort. Es hängt davon ab, wie Sie das Terminal aus den Terminals auswählen möchten, bei denen Sie angemeldet sind.

Für typische Anwendungen wäre eine GUI-Benachrichtigung besser geeignet. Sie können verwenden notify-send. Sie müssen die DISPLAYUmgebungsvariable festlegen .

0 07-17 * * * DISPLAY=:0 notify-send "$(/home/dat/scripts/cron.out)"
Gilles 'SO - hör auf böse zu sein'
quelle
2

Cron sendet die Ausgabe an einen Mailer. Wenn Sie die Ausgabe in einem Terminal anzeigen möchten, können Sie sich in einer Datei anmelden und mit tail -f die Ausgabe in dem Terminal anzeigen, für das Sie die Ausgabe anzeigen möchten


In eine Datei einloggen

  • Die einfachste Antwort ist, sich direkt in eine Datei mit einem crontab-Eintrag wie folgt einzuloggen:

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

Alternativen zur Protokollierung:

  • Wenn es sich bei Ihrem Programm um einen Scrip handelt, in den geschrieben werden kann, können Sie ihn ändern, um die Ausgabe in eine Protokolldatei mit umzuleiten. echo output > log.txtoder Sie können ein unten beschriebenes Wrapper- Skript verwenden.
  • Wenn Ihr Programm binär oder auf andere Weise nicht beschreibbar ist, müssen Sie ein Wrapper- Skript schreiben , um die Ausgabe in eine Datei zu erfassen.

Beispielprogramm und Wrapper-Skript:

$ 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

Beispiellauf 1:

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

Beispiellauf 2:

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

Ausgabe im Terminal anzeigen:

Nachdem Sie in einem beliebigen Terminal sowohl Standard- als auch Standardfehler in einer Datei abgemeldet haben, können Sie tail -feine oder beide Dateien wie tail -f log.txtoder tail -f log.txt error.txtso ausführen , dass tail die Datei (en) auf Änderungen überwacht bzw. eher befolgt. Schwanz-Manpage

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

==> error.txt <==
sample error

Protokolldateien, die anschließend angehängt werden:

Wenn später entweder log.txt oder error.txt von Ihrem Programm oder einem anderen Terminal angehängt werden $ echo "more output" >> log.txt, wird die Ausgabe auf dem laufenden Terminal angezeigt$ tail -f log.txt error.txt

==> log.txt <==
more output

Darüber hinaus $ echo code red >> error.txtergibt sich:

==> error.txt <==
code red
Keith Reynolds
quelle