มีโปรแกรมที่สามารถส่งอีเมลแจ้งเตือนเมื่อกระบวนการเสร็จสิ้นหรือไม่?


46

ฉันเป็นนักวิทยาศาสตร์การคำนวณและฉันใช้การคำนวณจำนวนมากบนลีนุกซ์ โดยเฉพาะฉันเรียกใช้การจำลองโมเลกุล (MD) โดยใช้แพ็คเกจ GROMACS การจำลองเหล่านี้อาจใช้เวลาหลายวันหรือหลายสัปดาห์ทำงานบน (เช่น) 8 ถึง 24 แกน ฉันสามารถเข้าถึงหลายโหนดของคลัสเตอร์ซึ่งหมายความว่าในเวลาใดก็ตามฉันกำลังทำงานประมาณ 4 หรือ 5 งาน (แต่ละงานบนโหนดที่แตกต่างกันและแต่ละงานใน 8-24 คอร์)

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

มีวิธีใดบ้างที่ฉันสามารถรับอีเมลเมื่อกระบวนการ Linux เสร็จสิ้น มีโปรแกรม Linux ที่ทำสิ่งนี้หรือไม่? ด้วยวิธีนี้ฉันจะรู้ว่าเมื่อใดที่ต้องล็อกอินด้วยเทอร์มินัลและเตรียมการจำลองต่อไป

ฉันใช้ Ubuntu Linux ขอบคุณที่สละเวลา.


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

5
@ABB ในฐานะนักวิทยาศาสตร์ฉันคิดว่าจะมีข้อมูลที่เป็นประโยชน์ในคำอธิบาย "ยาวและไม่เกี่ยวข้อง" ตัวอย่างเช่นเรารู้ว่าจำเป็นต้องทำงานด้วยตนเองและด้วยเหตุนี้จึงมีเหตุผลในการถามคำถาม นอกจากนี้เรามีความคิดเกี่ยวกับสิ่งที่ OP กำลังทำอยู่ดังนั้นเราจึงไม่ได้คิดอย่างสิ้นเชิงในความมืดและอาจให้ข้อมูลเพิ่มเติมซึ่งไม่ได้ขอในคำถาม แต่อาจจะใช้หรือสนใจ
3728501

คำตอบ:


30

งานที่ส่งไปยังatdaemon จะส่งผลลัพธ์ใด ๆ ถึงคุณจาก stderr และ stdout เมื่อเสร็จสิ้น นอกจากนี้ยังสามารถกำหนดค่าให้ส่งจดหมายแม้ว่างานจะไม่มีเอาต์พุต นอกจากนี้ยังมีประโยชน์ในการทำงานโดยไม่มีเทอร์มินัลการควบคุมดังนั้นคุณไม่ต้องกังวลกับผลกระทบที่การปิดเทอร์มินัลของคุณจะมีผลกับงาน

ตัวอย่าง:

echo "/opt/product/bin/job.sh data123"|at -m NOW

เมื่องานนี้เสร็จสมบูรณ์ผู้ใช้ที่ส่งงานจะได้รับอีเมลและหากมีผลลัพธ์ใด ๆ ที่คุณจะได้รับ คุณสามารถเปลี่ยนผู้รับอีเมลได้โดยเปลี่ยนLOGNAMEตัวแปรสภาพแวดล้อม

atมีโหมดแบทช์ที่คุณสามารถจัดคิวงานให้ทำงานเมื่อระบบไม่ว่าง นี่ไม่ใช่ระบบการจัดคิวที่ดีมากเมื่อผู้ใช้หลายคนกำลังแย่งชิงทรัพยากร แต่ถึงกระนั้นถ้าคุณต้องการใช้งานด้วย:

echo "/opt/product/bin/job.sh dataA"|batch
echo "/opt/product/bin/job.sh dataB"|batch
echo "/opt/product/bin/job.sh dataC"|batch

โดยค่าเริ่มต้นงานจะไม่เริ่มเว้นแต่ว่าโหลดระบบต่ำกว่า 1.5 แต่สามารถปรับรูปโหลดได้ (และมี 24 คอร์ที่ฉันต้องการบอกคุณ) พวกเขาสามารถทำงานแบบขนานได้หากพวกเขาไม่ชน loadavg เกินขีด จำกัด การโหลด (1.5 ค่าเริ่มต้นอีกครั้ง) หรือหากพวกเขาชน loadavg มากกว่า 1.5 พวกเขาจะทำงานแบบอนุกรม

คุณสามารถดูคิวงานด้วยatqและลบงานด้วยatrm

คำตอบอ้างอิง:

  1. กำลังทำงานatddaemon ( ps -ef|grep atd)
  2. คุณได้รับอนุญาตให้ส่งงานไปยังatd(ไม่ได้ถูกปฏิเสธ/etc/at.deny/ /etc/at.allowกำหนดค่า)
  3. sendmailMTA เชิงหน้าที่

ระบบส่วนใหญ่ไม่มีปัญหากับข้อกำหนดเหล่านี้ แต่ก็คุ้มค่าที่จะตรวจสอบ


49

ใช่มี

command; echo "Process done" | mail -s "Process done" mail@domain.tld

โดยที่ -s "text" เป็นหัวเรื่อง echo จะส่งข้อความให้กับคุณทางไปรษณีย์


4
mailคำสั่งไม่ต้องใช้เอ็มทีในท้องถิ่นที่จะกำหนดค่าอย่างถูกต้อง นี่เป็นวิธีที่ง่ายและสะดวก
จอร์แดน

6
คุณสามารถใช้mailเพื่อส่งผลลัพธ์ของคำสั่ง:{ command; echo Done; } | mail -s "subject" recipient@example.com
glenn jackman

4
@Andrew อย่าลืมว่าสิ่งนี้จะทำให้ terminal / shell ที่คุณรันคำสั่งดั้งเดิมนั้นยังคงเปิดอยู่ สิ่งนี้อาจไม่ยากหากคุณใช้บางสิ่งบางอย่างเช่นscreenหรือtmuxแต่อาจจะงี่เง่าที่จะเปิดเทอร์มินัลสักวัน / สัปดาห์ วิธีการแก้ปัญหาที่มีatการบริหารจัดการงานยังจะดูแลปัญหาที่
Caleb

@Caleb ไม่สามารถเพิ่ม a &ท้ายคำสั่งเพื่อให้มันรันที่พื้นหลัง sleep 30 && echo "Process done" | mail -s "Process done" mail@domain.tld &
Theo Kouzelis

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

7

ฉันขอแนะนำให้ตั้งค่าสคริปต์ python เพื่อส่งอีเมลซึ่งง่ายต่อการเขียนและกำหนดค่าเซิร์ฟเวอร์การส่งเมลที่ถูกต้องสำหรับบริการที่คุณใช้ พวกเขามีลักษณะเช่นนี้:

#!/usr/bin/python

import smtplib

sender = 'from@fromdomain.com'
receivers = ['to@todomain.com']

message = """From: From Person <from@fromdomain.com>
To: To Person <to@todomain.com>
Subject: SMTP e-mail test

This is a test e-mail message.
"""

try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, receivers, message)         
   print "Successfully sent email"
except SMTPException:
   print "Error: unable to send email"

ใช้สิ่งนี้ร่วมกับผู้ควบคุมท่อที่แนะนำในคำตอบอื่น ๆ

อีกวิธีที่ดีที่ฉันได้พบปัญหานี้คือการใช้เสน่ห์ดึงดูด Pushover - "Pushover ทำให้ง่ายต่อการส่งการแจ้งเตือนตามเวลาจริงไปยังอุปกรณ์ Android และ iOS ของคุณ" ฉันตั้งค่าสคริปต์อย่างง่ายซึ่งเพิ่ม API ง่าย ๆ ให้กับการส่งข้อความไปยังโทรศัพท์เมื่อสร้างงานเสร็จแล้ว

curl -s \
  -F "token=APP_TOKEN" \
  -F "user=USER_KEY" \
  -F "message=The build is done." \
  https://api.pushover.net/1/messages.json

6

นอกจากนี้คุณยังสามารถใช้ trapคำสั่งสำหรับการส่งจดหมายเมื่อออกจากกระบวนการหรือที่ interupt, hangup หรือเมื่อสิ้นสุดกระบวนการนี่คือรหัสที่คุณต้องวางที่ด้านบนสุดของสคริปต์ของคุณ

    trap 'mail -s "Process done" mail@domain.tld' exit # It will mail on normal exit
    trap 'mail -s "Process interrupted" mail@domain.tld' INT HUP# it will mail on interrupt or hangup  of the process

อรุณ


5

ฉันเขียน process_watcher.py

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

ขณะนี้เนื้อหาของอีเมลดูเหมือนว่า:

PID 18851: /usr/lib/libreoffice/program/soffice.bin --writer --splash-pipe = 5
เริ่มต้น: Thu, 10 มี.ค. 18:33:37 สิ้นสุดวันที่: Thu, มี.ค. 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 หากคุณต้องการการปรับปรุงใด ๆ


2
ผู้ชนะสำหรับฉันเพราะสามารถแนบโดย PID ไปยังกระบวนการที่กำลังทำงานอยู่
joseph_morris

1
@joseph_morris ฉันเหมือนสคริปต์นี้เกินไป - แต่เพื่อความสมบูรณ์คุณสามารถแนบไปกับการทำงาน (ระงับผ่าน Ctrl-Z) fg ‹PID›; mail -s Completed to@example.com <<< 'Message here'กระบวนการโดยไม่ต้องช่วยที่นี้โดยการออกคำสั่ง
Konrad Rudolph

1

ฉันมีสคริปต์ที่ปลูกในบ้านซึ่งเหมาะกับฉัน การใช้งาน:

mail-after <your command>

มันจะส่งอีเมลที่มีข้อมูลที่มีความหมายในเรื่องและมีผลลัพธ์ของกระบวนการในร่างกาย

คำแนะนำในการติดตั้งอยู่บนหน้าหลักของ repo GitHub - ในขณะนี้สำหรับสคริปต์ทั้งหมด symlink ~/binถูกสร้างขึ้นใน


1

สมมติว่าโปรแกรมของคุณกำลังทำงานอยู่ให้ใช้ bash + pgrep เพื่อดู

# Check that "pgrep $PROGRAM" returns the rid PID.
PROGRAM=foo
RECIPIENTS=you@yours.com
echo Watching $PROGRAM; while pgrep $PROGRAM &>/dev/null ; do sleep 1; echo -ne "."; done ; echo "$PROGRAM process done" | /bin/mail -s "$PROGRAM process done" $RECIPIENTS;

ฉันใช้สิ่งที่คล้ายกัน: ในขณะที่ [[$ (pgrep myprog)]]; นอนหลับ 60 ทำ; echo "myprog is done" | mail -s "เสร็จสิ้นกระบวนการ" mail@example.com
marlar

0

สมัยก่อนฉันสร้างนามแฝงนี้ (ใน csh ตอนนี้ฉันใช้มันใน tcsh):

alias shunt "( \!* | Mail -s 'Output of: \!*' $user) >& /dev/null &"

มันต้องการให้Mailมีการติดตั้งและทำงานบนระบบของคุณ แต่มีข้อได้เปรียบที่คำสั่งของคุณทำงานตรงตามที่ได้จากบรรทัดคำสั่ง (รวมถึงนามแฝงการขยายตัวหนอน ฯลฯ ) - เมื่อคุณรันงานโดยใช้atหรือcronทำงานภายใต้ค่าเริ่มต้น สภาพแวดล้อมที่อาจแตกต่างกันพอที่จะทำให้สคริปต์ของคุณล้มเหลวหรือให้ผลลัพธ์ที่ผิดปกติ (ฉันถูกกัดโดยcronหลายครั้ง)

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