แจ้งเตือนเมื่อกระบวนการทำงานเสร็จสิ้น


21

มีคำถามและคำตอบเล็กน้อยที่นี่เกี่ยวกับการแจ้งเตือนเมื่อกระบวนการเสร็จสมบูรณ์ / ออก ( 1 , 2 ) - แต่ทั้งหมดนี้ถือว่าผู้ใช้ออกกระบวนการดังกล่าวด้วยตนเองและสามารถเขียนสคริปต์ด้วยการแจ้งเตือนที่สร้างขึ้นใน สคริปต์ที่ควบคุมหรือไพพ์กระบวนการในการแจ้งเตือนบางประเภท

สถานการณ์ของฉันคือฉันต้องการได้รับการแจ้งเตือนถึงความสมบูรณ์ / ออกของกระบวนการที่ผู้ใช้ของฉันไม่เริ่มต้น คือฉันกำลังประมวลผลไฟล์วิดีโอจำนวนมากบนเซิร์ฟเวอร์ Ubuntu 12.04 LTS การดำเนินการบางอย่างกับไฟล์เหล่านี้ใช้เวลานานมากดังนั้นฉันจึงต้องการการแจ้งเตือนบางอย่าง (อีเมลจะดีมาก) เมื่อไฟล์ใดไฟล์หนึ่งเสร็จสิ้น พวกเขาใช้เวลานานมากในการทำสิ่งนี้บนพื้นฐานแบบครั้งเดียวด้วยตนเองบนพื้นฐานของ PIT จะดีอย่างสมบูรณ์แบบ

เพื่อให้ข้อมูลเพิ่มเติม - สมมติว่าฉันกำลังประมวลผลไฟล์ขนาดใหญ่โดยเฉพาะและฉันเห็นว่ามีการพัฒนาไปสู่สคริปต์ FFMPEG กระบวนการเองเป็นสคริปต์ไพ ธ อน (ซึ่งค่อนข้างซับซ้อนและไม่ได้เขียนด้วยตัวเองและบางอย่าง ฉันไม่ต้องการแก้ไข - แม้ว่ามันจะเป็นวิธีการตรรกะแรก) ฉันจินตนาการว่าการออกคำสั่งหรือสคริปต์ด้วย PID ของการเรียกใช้สคริปต์ python ที่กล่าวถึงเป็นข้อโต้แย้งและเมื่อกระบวนการที่ใช้ PID นั้นไม่ได้ทำงานอีกต่อไปสคริปต์แจ้งเตือนก็จะทำสิ่งนั้น

ความคิดใด ๆ


monit ( mmonit.com/monit/documentation ) ดูเหมือนเป็นตัวเลือกที่มีศักยภาพ แต่มีความซับซ้อนมากกว่าสิ่งที่ฉันต้องการ - หวังว่าอาจจะมีวิธีที่ง่ายกว่าตรงกว่าและป่องน้อยลงในการทำเฉพาะสิ่งที่ฉันขอและไม่มาก .
ดองเกิล

คำตอบ:


9

ฉันเขียนprocess_watcher.py

process_watcher --pid 1234 --to me@gmail.com

ปัจจุบันเนื้อหาของอีเมลดูเหมือนว่า:

PID 18851: /usr/lib/libreoffice/program/soffice.bin --writer --splash-pipe = 5
เริ่มต้น: Thu, Mar 10 18:33:37 สิ้นสุดวันที่: Thu, Mar 10 18:34:26 (ระยะเวลา 0 : 00: 49)
หน่วยความจำ (ปัจจุบัน / สูงสุด) - ผู้อยู่อาศัย: 155,280 / 155,304 kB เสมือน: 1,166,968 / 1,188,216 kB

[+] indicates the argument may be specified multiple times, for example:
 process-watcher -p 1234 -p 4258 -c myapp -c "exec\d+" --to person1@domain.com --to person2@someplace.com

optional arguments:
  -h, --help            show this help message and exit
  -p PID, --pid PID     process ID(s) to watch [+]
  -c COMMAND_PATTERN, --command COMMAND_PATTERN
                        watch all processes matching the command name. (RegEx pattern) [+]
  -w, --watch-new       watch for new processes that match --command. (run forever)
  --to EMAIL_ADDRESS    email address to send to [+]
  -n, --notify          send DBUS Desktop notification
  -i SECONDS, --interval SECONDS
                        how often to check on processes. (default: 15.0 seconds)
  -q, --quiet           don't print anything to stdout

ยุติปัญหา GitHub หากคุณต้องการการปรับปรุงใด ๆ


23

อะไรแบบนี้?

(while kill -0 $pid; do sleep 1; done) && echo "finished"

แทนที่$pidด้วย id กระบวนการและecho "finished"ด้วยสิ่งที่คุณต้องการทำเมื่อกระบวนการออกจาก

ตัวอย่างเช่น:

(while kill -0 $pid; do sleep 1; done) && mail ...

มหัศจรรย์! ทำงานเหมือนจับใจ
ดองเกิล

1
หมายเหตุเล็กน้อย (และน่าจะชัดเจน) - เมื่อกระบวนการดังกล่าวไม่ได้เป็นของผู้ใช้จะต้อง sudo ฆ่า
ดองเกิล

1
@dongle อย่างน้อยในกล่อง RHEL ของฉันkill -0รายงานNo such processสำหรับ PIDs ที่ไม่มีอยู่จริงและOperation not permittedสำหรับ PIDs เป็นเจ้าของโดยผู้ใช้ที่แตกต่างกันดังนั้นบางทีการตีความข้อผิดพลาดควรขจัดความจำเป็นในการsudo
Iruvar

1
หากคุณกำลังสะท้อนคุณสามารถทำได้ตลอดecho -en "\007 \007 \007"ซึ่งจะออกเทอร์มินัล 'ระฆัง' การแปลนั้นเป็นเสียงที่ได้ยินจริงหรือไม่นั้นขึ้นอยู่กับเทอร์มินัลและฮาร์ดแวร์ของคุณ (แต่โดยทั่วไปแล้ว)
Morgon

5

ฉันใช้&&เพื่อรันคำสั่งที่สองเมื่อคำสั่งแรกเสร็จสมบูรณ์ นี่คือตัวอย่าง:

  1. ลบโฟลเดอร์ขนาดใหญ่และส่งเสียงบี๊บ:

    rm -rv ~/tmp && beep
  2. รวบรวมเคอร์เนลและส่งอีเมล:

    make && mail -s "Compilation is done" user@yourmaildomain.com

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

นอกจากนี้เชลล์สคริปต์สามารถรับสถานะการออก ( $?) ของคำสั่งของคุณและด้วยif/elseและลูปคุณสามารถทำสิ่งที่คุณต้องการ


ขอบคุณ Willian แต่อย่างที่ฉันบอกความท้าทายเฉพาะในกรณีใช้งานของฉันคือว่านี่ไม่ใช่คำสั่งที่ฉันใช้ แต่เป็นกระบวนการที่กำลังดำเนินอยู่ ดังนั้น && ไม่ใช่ตัวเลือก ขอบคุณอยู่ดี
ดองเกิล

4

หากคุณไม่มี pid สิ่งนี้จะทำงานจนกว่าอินสแตนซ์ทั้งหมดของ ffmpeg จะเสร็จสิ้น:

(while pidof ffmpeg | grep -q "[0-9]?"; do sleep 1; done) && echo "finished"

0

หากคุณไม่ต้องการใช้ตัวเลือกการสำรวจหรือสคริปต์ภายนอกและคุณได้เริ่มต้นกระบวนการที่ใช้เวลานานคุณสามารถระงับด้วย CTRL + Z (ส่งสัญญาณ SIGTSTP) แล้วดำเนินการต่อด้วยfg(ย้ายกระบวนการไปที่ เบื้องหน้า)

ตัวอย่างเช่น:

my_command  # long running command
# press CTRL+Z to pause
fg ; notify-send 'finished'

ยกเว้น ... "สถานการณ์ของฉันคือฉันต้องการได้รับการแจ้งเตือนถึงความสมบูรณ์ / ออกของกระบวนการที่ผู้ใช้ของฉันไม่ได้เริ่มต้น"
Jeff Schaller

-1

ฉันสร้างแอพที่จะส่งการแจ้งเตือนไปยังโทรศัพท์ Android ของคุณเมื่อกระบวนการสิ้นสุดลงดังนั้นคุณไม่จำเป็นต้องผูกติดกับคอมพิวเตอร์ของคุณ

ติดตั้งจากนั้นเพิ่ม;notifier.shไปยังจุดสิ้นสุดของคำสั่งของคุณ

ตัวอย่างเช่นหากคำสั่งของคุณเป็นmake installคุณจะทำให้คำสั่งของคุณ:

make install; notifier.sh

https://notifier.sh

https://play.google.com/store/apps/details?id=sh.notifier


“ … แต่สิ่งเหล่านี้ทั้งหมดสันนิษฐานว่าผู้ใช้ได้ออกกระบวนการดังกล่าวด้วยตนเองและสามารถเขียนสคริปต์ด้วยการแจ้งเตือนที่สร้างขึ้นในสคริปต์ที่ควบคุมหรือไพพ์กระบวนการเพื่อการแจ้งเตือนบางประเภท / สถานการณ์ของฉันคือฉันต้องการได้รับการแจ้งเตือนถึงความสมบูรณ์ / ออกจากกระบวนการที่ผู้ใช้ของฉันไม่เริ่มต้น "
G-Man กล่าวว่า 'Reinstate Monica'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.