Mendapatkan output dari pekerjaan cron di terminal


15

Saya memiliki program yang mencetak beberapa output yang ingin saya munculkan di terminal saya sekali setiap jam selama hari kerja.

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

syslog melaporkan yang berikut ini:

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

Apa yang saya lewatkan?


pekerjaan cron seharusnya tidak menulis ke terminal - mungkin tidak ada yang tersedia.
guntbert

Jawaban:


14

Cara kotor bisa dengan mengarahkan output program Anda ke file pts dari terminal yang sudah ada .

Untuk mengetahui file Poin cukup ketik ttyperintah

~$ tty
/dev/pts/4

maka crontab Anda adalah:

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

Cara lain bisa dengan meluncurkan program sebagai argumen terminal:

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

di mana displaytampilan X di mana Anda ingin menunjukkan terminal, -Hadalah untuk memberitahu terminal untuk tetap terbuka setelah perintah tersebut dihentikan. Ini akan membuat setiap kali terminal baru.

crontab:

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

jika tampilan tidak ada, Anda akan memiliki kesalahan yang dicatat oleh syslog.


6

Cron mengirimi Anda email hasil skrip Anda. Sayangnya, Ubuntu tidak mengatur mail lokal secara default , itulah sebabnya Cron memberi tahu Anda dalam log “Tidak ada MTA yang diinstal, membuang output”.

Menyiapkan surat lokal bisa menjadi salah satu cara untuk menyelesaikan masalah Anda. Alih-alih output di terminal, Anda akan mendapatkan pemberitahuan email.

Jika Anda ingin pekerjaan cron Anda keluaran ke terminal, Anda harus mengarahkan outputnya ke terminal. Bagian pengalihan mudah -

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

tetapi masalahnya adalah mencari tahu terminal mana yang akan dialihkan. Tidak ada jawaban universal untuk itu, tergantung bagaimana Anda ingin memilih terminal di antara terminal yang Anda masuki.

Untuk penggunaan umum, pemberitahuan GUI akan lebih sesuai. Anda bisa menggunakannya notify-send. Anda perlu mengatur DISPLAYvariabel lingkungan .

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

2

Cron mengirimkan output ke mailer. Jika Anda ingin melihat output di terminal maka Anda dapat masuk ke file dan menggunakan tail -f untuk melihat output di terminal yang ingin Anda lihat output


Log ke file

  • Jawaban paling sederhana adalah dengan login langsung ke file dengan entri crontab seperti:

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

Cara alternatif untuk masuk:

  • Jika program Anda adalah skrip yang dapat ditulis, Anda dapat memodifikasinya untuk mengarahkan kembali keluaran ke file log. echo output > log.txt, atau Anda dapat menggunakan skrip pembungkus yang dijelaskan di bawah ini.
  • Jika program Anda adalah biner atau tidak dapat ditulisi, maka Anda harus menulis skrip wrapper untuk menangkap output ke file.

Contoh program dan skrip 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

Contoh jalankan 1:

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

Contoh menjalankan 2:

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

Lihat output di terminal:

Sekarang saat Anda logout baik standard out maupun standard error ke sebuah file, di terminal apa pun, Anda dapat menjalankan tail -fsatu atau kedua file seperti tail -f log.txtatau tail -f log.txt error.txtagar tail akan menonton atau lebih tepatnya mengikuti file untuk perubahan. tail man-page

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

==> error.txt <==
sample error

File log yang ditambahkan setelahnya:

Jika log.txt atau error.txt ditambahkan kemudian dari program Anda atau dari terminal lain seperti $ echo "more output" >> log.txt, output terlihat pada terminal yang berjalan$ tail -f log.txt error.txt

==> log.txt <==
more output

Selanjutnya, $ echo code red >> error.txtmenghasilkan:

==> error.txt <==
code red
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.