Pobieranie danych wyjściowych z zadania cron na terminalu


15

Mam program, który drukuje dane wyjściowe, które chciałbym wyskakiwać na moim terminalu co godzinę w ciągu dnia roboczego.

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

syslog zgłasza następujące zdarzenia:

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

czego mi brakuje?


zadania cron nie powinny zapisywać na terminalu - być może nie są dostępne.
guntbert

Odpowiedzi:


14

Brudnym sposobem może być przekierowanie wyjścia programu do pliku pts już istniejącego terminala.

Aby poznać plik pts, po prostu wpisz ttypolecenie

~$ tty
/dev/pts/4

wtedy twój crontab byłby:

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

Innym sposobem może być uruchomienie programu jako argumentu terminala:

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

gdzie displayjest wyświetlacz X, w którym chcesz pokazać terminal, -Hma powiedzieć terminalowi, aby pozostawał otwarty po zakończeniu polecenia. Spowoduje to utworzenie za każdym razem nowego terminala.

crontab:

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

jeśli wyświetlacz nie jest obecny, będziesz mieć błąd zarejestrowany przez syslog.


6

Cron wysyła Ci wiadomość e-mail z danymi wyjściowymi skryptu. Niestety, Ubuntu domyślnie nie konfiguruje poczty lokalnej , dlatego Cron mówi ci w logach: „Nie zainstalowano MTA , odrzuca dane wyjściowe”.

Konfigurowanie poczty lokalnej może być jednym ze sposobów rozwiązania problemu. Zamiast wyjścia w terminalu otrzymasz powiadomienie e-mailem.

Jeśli chcesz, aby twoje zadanie cron było wysyłane do terminala, musisz przekierować jego dane wyjściowe do terminala. Część przekierowania jest łatwa -

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

ale problemem jest ustalenie, do którego terminala należy przekierować. Nie ma uniwersalnej odpowiedzi na to pytanie, zależy to od tego, jak chcesz wybrać terminal spośród tych, na które jesteś zalogowany.

W przypadku typowych zastosowań bardziej odpowiednie byłoby powiadomienie GUI. Możesz użyć notify-send. Musisz ustawić DISPLAYzmienną środowiskową .

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

2

Cron wysyła dane wyjściowe do programu pocztowego. Jeśli chcesz zobaczyć dane wyjściowe w terminalu, możesz zalogować się do pliku i użyć tail -f, aby wyświetlić dane wyjściowe w terminalu, który chcesz zobaczyć dane wyjściowe


Zaloguj się do pliku

  • Najprostszą odpowiedzią jest zalogowanie się bezpośrednio do pliku z wpisem crontab, takim jak:

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

Alternatywne sposoby logowania:

  • Jeśli twój program jest skryptem, w którym można zapisać, możesz go zmodyfikować, aby przekierować dane wyjściowe do pliku dziennika za pomocą. echo output > log.txtlub możesz użyć skryptu opakowania opisanego poniżej.
  • Jeśli twój program jest binarny lub w inny sposób nie można go zapisać, musisz napisać skrypt opakowujący, aby przechwycić dane wyjściowe do pliku.

Przykładowy program i skrypt opakowania:

$ 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

Przykładowy przebieg 1:

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

Przykładowy przebieg 2:

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

Wyświetl dane wyjściowe w terminalu:

Teraz, gdy zalogowaniu zarówno standardowe wyjście oraz standardowy błąd w pliku, w każdym terminalu, można uruchomić tail -fna jednym lub obu plików jak tail -f log.txti tail -f log.txt error.txttak, że ogon będzie obserwować czy raczej śledzić plik (ów) do poprawek. strona ogona

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

==> error.txt <==
sample error

Pliki dziennika dołączane później:

Jeśli później log.txt lub error.txt zostaną później dołączone z programu lub innego terminala $ echo "more output" >> log.txt, dane wyjściowe są widoczne na uruchomionym terminalu$ tail -f log.txt error.txt

==> log.txt <==
more output

Ponadto $ echo code red >> error.txtskutkuje:

==> error.txt <==
code red
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.