Terminaldeki bir cron işinden çıktı alma


15

İş günü boyunca her saat başı bir kez terminalimde açmak istediğim çıktıları basan bir programım var.

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

syslog aşağıdakileri rapor eder:

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

Neyi kaçırıyorum?


cron işlerinin bir terminale yazması gerekmiyor - hiç bir şey olmayabilir.
guntbert

Yanıtlar:


14

Kirli yol, programınızın çıktısını zaten var olan bir terminalin pts dosyasına yönlendirmek olabilir .

Pts dosyasını bilmek için sadece ttykomut yazın

~$ tty
/dev/pts/4

o zaman crontab'ınız:

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

Başka bir yol, terminalin bir argümanı olarak programı başlatmak olabilir:

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

nerede displaysen terminali göstermek istiyorum X'in ekran olduğunu -Hkomut sonlandırılır sonra terminali açık kalmak anlatmaktır. Bu, her seferinde yeni bir terminal yaratacaktır.

crontab:

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

ekran yoksa syslog tarafından kaydedilen bir hata ile karşılaşırsınız.


6

Cron, komut dosyanızın çıktısını size e-posta ile gönderir. Ne yazık ki, Ubuntu varsayılan olarak yerel posta kurmaz , bu nedenle Cron size “ MTA yüklü değil, çıktıları atar ” günlüklerinde söyler .

Yerel postayı ayarlamak sorununuzu çözmenin bir yolu olabilir. Terminaldeki bir çıktı yerine, bir e-posta bildirimi alırsınız.

Cron işinizin bir terminale çıkış yapmasını istiyorsanız , çıkışını terminale yönlendirmeniz gerekir . Yönlendirme kısmı kolaydır -

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

ancak sorun hangi terminale yönlendirileceğini bulmaktır. Bunun evrensel bir cevabı yok, giriş yaptığınız terminaller arasında terminali nasıl seçmek istediğinize bağlı.

Tipik kullanımlar için bir GUI bildirimi daha uygun olacaktır. Kullanabilirsiniz notify-send. Ortam değişkenini ayarlamanızDISPLAY gerekir .

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

2

Cron çıktıyı bir postaya gönderir. Çıkışı bir terminalde görmek istiyorsanız, bir dosyaya giriş yapabilir ve çıktıyı görmek istediğiniz terminaldeki çıktıyı görüntülemek için tail -f komutunu kullanabilirsiniz.


Bir dosyaya giriş yapın

  • En basit cevap, crontab girişi olan bir dosyaya doğrudan giriş yapmaktır:

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

Günlüğe kaydetmenin alternatif yolları:

  • Programınız yazılabilecek bir komut dosyasıysa, çıktıyı bir günlük dosyasına yeniden yönlendirmek için değiştirebilirsiniz. echo output > log.txtveya aşağıda açıklanan bir sarmalayıcı komut dosyası kullanabilirsiniz .
  • Programınız bir ikili veya başka türlü yazılamazsa, bir dosyaya çıktı yakalamak için sarıcı komut dosyası yazmalısınız .

Örnek program ve sarıcı komut dosyası:

$ 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

Örnek çalışma 1:

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

Örnek çalışma 2:

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

Terminaldeki çıkışı görüntüle:

Artık reklam herhangi terminalde bir dosyaya hem standart out ve standart hatayı, günlüğü göre, çalıştırabilir tail -fgibi bir veya her iki dosyalar üzerinde tail -f log.txtveya tail -f log.txt error.txtkuyruk izlemek ya da daha doğrusu değişiklikler için dosya (lar) takip edecek şekilde yerleştirin. kuyruk adam sayfası

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

==> error.txt <==
sample error

Sonradan eklenen dosyaları günlüğe kaydetme:

Log.txt veya error.txt dosyalarına daha sonra programınızdan veya benzeri bir terminalden eklenirse $ echo "more output" >> log.txt, çıkış çalışan terminalde görülür$ tail -f log.txt error.txt

==> log.txt <==
more output

Ayrıca, $ echo code red >> error.txtsonuç:

==> error.txt <==
code red
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.