ดูที่เอาต์พุต `at` ก่อนที่มันจะเสร็จสมบูรณ์


8

สมมติว่าฉันรันสคริปต์ด้วยatบน Linux (ตัวอย่างด้านล่าง) ที่ฉันรู้จะใช้เวลาหลายชั่วโมงหรืออาจจะนานหลายวัน ฉันคุ้นเคยกับการatส่งอีเมลด้วยเอาต์พุตของคำสั่งเมื่อมันเสร็จสมบูรณ์ แต่ถ้าฉันต้องการที่จะดูที่ผลลัพธ์ปัจจุบันก่อนที่มันจะเสร็จสมบูรณ์? และสมมติว่าผมเคยทำงานอยู่แล้วสคริปต์และลืมที่จะเปลี่ยนเส้นทางออกโดยใช้tail, teeหรือวิธีการอื่น ๆ ที่คล้ายกันและไม่ต้องการที่จะหยุดสคริปต์ มีอะไรให้ทำอีกไหม?

drew@anubis:~$ at now
warning: commands will be executed using /bin/sh
at> ./myscript.sh
at> <EOT>
job 3 at Sat Jan  7 09:31:00 2017

ยอดหรือมอง คุณต้องการที่จะเห็นสิ่งที่มันทำในขณะที่มันทำมัน?
Geek

@JourneymanGeek โอ๊ะโอ ดูจะเป็นสิ่งที่ฉันต้องการพิมพ์ ฉันต้องการที่จะเห็นสิ่งที่มันทำ
Drew Chapin

เปลี่ยนเส้นทางสคริปต์ออกเป็นไฟล์เมื่อคุณกำหนดเวลางานและtail -fไฟล์นั้น?
muru

@muru ลองทำเป็นว่าฉันได้เรียกใช้สคริปต์แล้วโดยไม่ใช้tailและไม่ต้องการหยุด
Drew Chapin

ฉันต้องการทดสอบ แต่จะแก้ไขสคริปต์เพื่อใช้ทีและบันทึกผลลัพธ์ไปยังไฟล์จากนั้นปรับให้เป็นแบบนั้นใช่ไหม
Geek

คำตอบ:


9

หากงานเริ่มต้นขึ้นและคุณมีวิธีรับ PID ของงานนั้นคุณจะเห็นว่าatกำลังบันทึกเอาต์พุตอยู่ที่ไหน:

$ at now
warning: commands will be executed using /bin/sh
at> sleep 10m
at> <EOT>
job 7 at Sat Jan  7 20:18:00 2017
$ pgrep sleep
7582
$ ls -l /proc/7582/fd
total 0
lr-x------ 1 muru muru 64 Jan  7 20:19 0 -> /var/spool/cron/atjobs/a0000701795998 (deleted)
lrwx------ 1 muru muru 64 Jan  7 20:19 1 -> /var/spool/cron/atspool/a0000701795998
lrwx------ 1 muru muru 64 Jan  7 20:19 2 -> /var/spool/cron/atspool/a0000701795998

อย่างที่คุณเห็นผลลัพธ์จะถูกบันทึกเป็นไฟล์ชั่วคราวซึ่งตอนนี้คุณสามารถตรวจสอบ:

$ sudo tail -f /var/spool/cron/atspool/a0000701795998
Subject: Output from your job        7
To: muru

คุณต้องการsudoเพราะไดเรกทอรีที่บรรจุไม่สามารถเข้าถึงได้ทั่วโลก (อย่างน้อยใน Ubuntu 14.04):

$ sudo namei -lx /var/spool/cron/atspool/a0000701795998
f: /var/spool/cron/atspool/a0000701795998
Drwxr-xr-x root     root   /
drwxr-xr-x root     root   var
drwxr-xr-x root     root   spool
drwxr-xr-x root     root   cron
drwxrwx--T daemon   daemon atspool
-rw------- muru     muru   a0000701795998

1
คุณเป็นฮีโร่ของฉัน! มันทำงานได้อย่างสมบูรณ์แบบ!
Drew Chapin

4
ฉันต้องการที่จะเพิ่มว่าถ้าคุณรู้ว่าคุณทำงานเพียงatงานเดียว คุณไม่จำเป็นต้องมี PID ด้วยซ้ำ คุณสามารถเรียกใช้sudo ls /var/spool/cron/atspoolและควรในทางทฤษฎีเป็นไฟล์เดียวที่มี
Drew Chapin

0

atqวิธีการตรวจสอบว่าแฟ้มเก็บพักเป็นงานของคุณก็คือการได้รับหมายเลขงานจาก

drew@sokar:~$ atq
38      Tue Jul 10 12:15:00 2018 = drew

แปลงหมายเลขงานเป็นเลขฐานสิบหก เช่น 38 (ธันวาคม) = 26 (ฐานสิบหก)

drew@sokar:~$ printf "%x\n" 38
26

ไฟล์ของคุณจะมีชื่อว่า Queue letter (99% ของเวลาa) จากนั้นตามด้วย id งานฐานสิบหก 5 หลัก (ฉันเรียนรู้สิ่งนี้โดยดูจากซอร์สโค้ดของatคำสั่ง)

drew@sokar:~$ sudo ls -l /var/spool/cron/atspool
total 55968
-rw------- 1 drew drew       49 Feb 16  2017 a0001c017a3cb2
-rw------- 1 drew drew 57297586 Feb 26  2017 a0001e017a7405
-rw------- 1 drew drew     2329 Jul 10 12:21 a0002601856a0f
                                              -----

จากนั้นคุณสามารถดู stdout

drew@sokar:~$ sudo less /var/spool/cron/atspool/a0002601856a0f
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.