รับเอาต์พุตจากงาน cron บนเทอร์มินัล


15

ฉันมีโปรแกรมที่พิมพ์ผลลัพธ์บางอย่างที่ฉันต้องการให้ปรากฏขึ้นที่เทอร์มินัลของฉันทุก ๆ ชั่วโมงในระหว่างวันทำงาน

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

syslog รายงานต่อไปนี้:

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

ฉันพลาดอะไรไป


งาน cron ไม่ควรเขียนลงในเทอร์มินัล - อาจไม่มีอยู่
guntbert

คำตอบ:


14

วิธีที่สกปรกอาจเป็นการเปลี่ยนเส้นทางเอาต์พุตของโปรแกรมไปยังไฟล์ pts ของเทอร์มินัลที่มีอยู่แล้ว

หากต้องการทราบว่าไฟล์ pts เพียงแค่พิมพ์ttyคำสั่ง

~$ tty
/dev/pts/4

จากนั้น crontab ของคุณจะเป็น:

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

วิธีอื่นอาจเป็นการเปิดโปรแกรมเป็นอาร์กิวเมนต์ของเทอร์มินัล:

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

โดยที่displayX display คือตำแหน่งที่คุณต้องการแสดงเทอร์มินัล-Hคือการบอกให้เทอร์มินัลเปิดอยู่หลังจากคำสั่งถูกยกเลิก สิ่งนี้จะสร้างทุกครั้งที่มีเทอร์มินัลใหม่

crontab:

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

หากจอแสดงผลไม่ปรากฏคุณจะมีข้อผิดพลาดที่บันทึกโดย syslog


6

Cron ส่งอีเมลถึงคุณถึงสคริปต์ของคุณ น่าเสียดายที่อูบุนตูไม่ได้ตั้งค่าเมลภายในโดยค่าเริ่มต้นซึ่งเป็นสาเหตุที่ Cron บอกคุณในบันทึก“ ไม่มีการติดตั้งMTAเพื่อยกเลิกเอาต์พุต”

การตั้งค่าเมลท้องถิ่นอาจเป็นวิธีหนึ่งในการแก้ปัญหาของคุณ แทนที่จะส่งออกใน terminal คุณจะได้รับอีเมลแจ้งเตือน

หากคุณต้องการให้งาน cron ของคุณส่งออกไปยังเทอร์มินัลคุณจะต้องเปลี่ยนทิศทางงานไปยังเทอร์มินัล ส่วนการเปลี่ยนเส้นทางนั้นง่าย -

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

แต่ปัญหาคือการหาว่าเทอร์มินัลใดที่จะเปลี่ยนเส้นทางไป ไม่มีคำตอบที่เป็นสากลสำหรับเรื่องนี้ขึ้นอยู่กับว่าคุณต้องการเลือกเทอร์มินัลระหว่างที่คุณลงชื่อเข้าใช้

สำหรับการใช้งานทั่วไปการแจ้งเตือน GUI จะเหมาะสมกว่า notify-sendคุณสามารถใช้ คุณจะต้องตั้งค่าDISPLAYตัวแปรสภาพแวดล้อม

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

2

Cron ส่งเอาต์พุตไปยังจดหมาย หากคุณต้องการเห็นเอาต์พุตในเทอร์มินัลคุณสามารถเข้าสู่ไฟล์และใช้ tail -f เพื่อดูเอาต์พุตในเทอร์มินัลที่คุณต้องการเห็นเอาต์พุต


บันทึกลงไฟล์

  • คำตอบที่ง่ายที่สุดคือการเข้าสู่ไฟล์โดยตรงด้วยรายการ crontab เช่น:

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

วิธีอื่น ๆ ในการเข้าสู่ระบบ:

  • หากโปรแกรมของคุณเป็น scrip ที่สามารถเขียนได้คุณสามารถแก้ไขมันเพื่อเปลี่ยนเส้นทางเอาต์พุตไปยังไฟล์บันทึกด้วย echo output > log.txtหรือคุณสามารถใช้สคริปต์ตัวตัดคำอธิบายด้านล่าง
  • หากโปรแกรมของคุณเป็นแบบไบนารี่หรือไม่สามารถเขียนได้คุณต้องเขียนสคริปต์ตัวคลุมเพื่อจับเอาท์พุทไปยังไฟล์

ตัวอย่างโปรแกรมและสคริปต์ตัวตัดคำ:

$ 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

ตัวอย่างการเรียกใช้ 1:

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

ตัวอย่างการรัน 2:

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

ดูเอาต์พุตในเทอร์มินัล:

ตอนนี้การบันทึกของคุณทั้งข้อผิดพลาดมาตรฐานและข้อผิดพลาดมาตรฐานไปยังไฟล์ในเทอร์มินัลใด ๆ คุณสามารถรันtail -fบนหนึ่งหรือทั้งสองไฟล์เช่นtail -f log.txtหรือtail -f log.txt error.txtเพื่อให้ส่วนท้ายดูหรือค่อนข้างตามไฟล์เพื่อแก้ไข หางหน้าคน

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

==> error.txt <==
sample error

การบันทึกไฟล์ต่อท้าย:

หาก log.txt หรือ error.txt ต่อท้ายจากโปรแกรมของคุณหรือจากเทอร์มินัลอื่นเช่น$ echo "more output" >> log.txtในภายหลังจะเห็นเอาต์พุตในเทอร์มินัลที่กำลังทำงานอยู่$ tail -f log.txt error.txt

==> log.txt <==
more output

นอกจากนี้$ echo code red >> error.txtผลลัพธ์ใน:

==> error.txt <==
code red
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.