क्या कोई प्रोग्राम है जो मुझे एक प्रक्रिया समाप्त होने पर एक अधिसूचना ई-मेल भेज सकता है?


46

मैं एक कम्प्यूटेशनल वैज्ञानिक हूं, और मैं लिनक्स पर बहुत लंबी गणना चलाता हूं। विशेष रूप से, मैं GROMACS पैकेज का उपयोग करके आणविक गतिशीलता (एमडी) सिमुलेशन चलाता हूं। ये सिमुलेशन 8 या 24 कोर पर (उदाहरण के लिए) चल रहा है, दिन या सप्ताह लग सकते हैं। मेरे पास एक क्लस्टर के कई नोड्स तक पहुंच है, जिसका मतलब है कि किसी भी समय, मैं लगभग 4 या 5 नौकरियां (प्रत्येक अलग नोड पर, और प्रत्येक 8-24 कोर पर) चला रहा हूं।

समस्या यह है कि सिमुलेशन समय की एक चर राशि लेते हैं। मैं घड़ी के आसपास सिमुलेशन पर काम करने वाले सभी नोड्स रखना पसंद करता हूं, लेकिन एक नया सिमुलेशन शुरू करने के लिए, मुझे एक टर्मिनल के साथ लॉग इन करना होगा और कुछ मैनुअल काम करना होगा। लेकिन मैं हमेशा भूल जाता हूं कि एक सिमुलेशन में कितना समय बचा है, इसलिए मैं हमेशा उनकी जांच करता हूं।

क्या कोई ऐसा तरीका है जिससे मैं लिनक्स प्रक्रिया समाप्त होने पर ई-मेल प्राप्त कर सकता हूं? क्या ऐसा लिनक्स प्रोग्राम हो सकता है जो ऐसा करता है? इस तरह से मुझे पता होगा कि कब एक टर्मिनल के साथ लॉग इन करना है और अगला सिमुलेशन तैयार करना है।

मैं उबंटू लिनक्स का उपयोग कर रहा हूं। आपके समय के लिए धन्यवाद।


3
यह एक सरल प्रश्न के लिए एक लंबा और अप्रासंगिक विवरण था जो पहले से ही शीर्षक में शामिल था। क्या आप हमेशा ऐसा करते हैं?
एक्यूमेनस

5
@ABB एक वैज्ञानिक के रूप में मैं "लंबे और अप्रासंगिक" विवरण में उपयोगी जानकारी होना चाहता हूँ। उदाहरण के लिए, हम जानते हैं कि मैनुअल टर्मिनल कार्य की आवश्यकता है और इसलिए प्रश्न पूछने का एक कारण है। इसके अलावा हमारे पास कुछ विचार है कि ओपी क्या कर रहा है इसलिए हम पूरी तरह से अंधेरे में नहीं सोच रहे हैं और इसलिए अतिरिक्त जानकारी प्रदान करने में सक्षम हो सकते हैं जो प्रश्न में अनुरोध नहीं किया गया है, लेकिन उपयोग या रुचि का हो सकता है।
user3728501

जवाबों:


30

atडेमॉन को सौंपे गए जॉब्स आपको पूरा होने पर 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 कोर के साथ मैं आपको कहूंगा)। वे समानांतर में चल सकते हैं यदि वे लोड सीमा (1.5 डिफ़ॉल्ट फिर से) पर लोडाव को टक्कर नहीं देते हैं, या यदि वे व्यक्तिगत रूप से लोडावग को 1.5 से अधिक टकराते हैं, तो वे धारावाहिक में चलेंगे।

आप के साथ नौकरी की कतार देख सकते हैं atq, और नौकरियों को हटा सकते हैंatrm

उत्तर निर्भरता:

  1. रनिंग atdडेमॉन ( ps -ef|grep atd)
  2. आपको जॉब सबमिट करने की अनुमति है atd(इंकार /etc/at.deny/ /etc/at.allowविन्यास द्वारा नहीं )
  3. कार्यात्मक sendmailएमटीए

अधिकांश प्रणालियों को इन आवश्यकताओं के साथ कोई समस्या नहीं है, लेकिन यह जांचने के लिए सार्थक है।


49

हाँ, वहाँ है

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

जहाँ-जहाँ "टेक्स्ट" विषय है, इको मेल आपको भेजने के लिए कुछ टेक्स्ट देता है।


4
mailआदेश स्थानीय एमटीए की आवश्यकता होती है ठीक से विन्यस्त किया जाना है। यह आसान और सरल उपाय है।
जोर्डनम

6
आप mailकमांड का आउटपुट भेजने के लिए भी उपयोग कर सकते हैं :{ command; echo Done; } | mail -s "subject" recipient@example.com
ग्लेन जैकमैन

4
@Andrew जानते हैं कि इसके लिए टर्मिनल / शेल को काम करने के लिए आपको खुले रहने के लिए मूल कमांड को चलाना होगा। यह मुश्किल नहीं हो सकता है अगर आप कुछ का उपयोग करते हैं screenया ऐसा करते हैं tmux, लेकिन हो सकता है कि इसके बिना किसी दिन / सप्ताह के लिए टर्मिनल खुला हो। साथ समाधान atनौकरी प्रबंधन के लिए भी है कि समस्या का ख्याल रखना होगा।
कालेब

@ कैलेब कैंट आप &कमांड के अंत में इसे पीछे के मैदान में चलाने के लिए जोड़ते हैं । sleep 30 && echo "Process done" | mail -s "Process done" mail@domain.tld &
थियो कोजेलिस

@ आप नहीं कर सकते। यहां तक ​​कि पृष्ठभूमि में प्रक्रिया अभी भी आपके शेल का एक बच्चा है और यदि शेल की मृत्यु हो जाती है तो बच्चे की प्रक्रिया को एक किल सिग्नल प्राप्त होगा। आप उन्हें अनलिंक करने के लिए उपयोग कर सकते हैं nohup, लेकिन आप इसे शेल से नियंत्रित करना जारी रखने की क्षमता भी खो देते हैं। यह आंशिक रूप से इसके tmuxलिए है। यह आपके सक्रिय रूप से जुड़े और देखे गए टर्मिनल सत्र से चल रही प्रक्रियाओं को तलाक देता है, जबकि अभी भी आपको सामान्य रूप से उनके साथ बातचीत करने देता है।
कालेब

7

मैं एक ईमेल भेजने के लिए एक अजगर स्क्रिप्ट स्थापित करने की सलाह दूंगा, वे जो भी सेवा का उपयोग करते हैं उनके लिए सही मेलिंग सर्वर लिखना और कॉन्फ़िगर करना बहुत आसान है। वे कुछ इस तरह दिखते हैं:

#!/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"

अन्य उत्तरों में सुझाए गए पाइप ऑपरेटर के साथ मिलकर इसका उपयोग करें।

इस समस्या का एक और बढ़िया समाधान मुझे मिल गया है, वह है पुलोवर । पुशओवर - "पुशओवर आपके एंड्रॉइड और आईओएस उपकरणों के लिए वास्तविक समय की सूचनाएं भेजना आसान बनाता है।" मैंने एक साधारण स्क्रिप्ट को सेटअप किया है, जो मेरे बिल्ड होने पर अपने फोन पर एक संदेश भेजने के लिए आसान एपीआई को पूरा करती है।

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प्रक्रिया से बाहर निकलने पर, या इंटरप्ट, हैंगअप या प्रक्रिया की समाप्ति पर मेल भेजने के लिए कमांड का उपयोग कर सकते हैं। यह वह कोड है जिसे आपको अपनी स्क्रिप्ट के शीर्ष पर रखना होगा।

    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-पाइप = 5
शुरू: गुरु, 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 मुद्दे को Ceate करें।


2
मेरे लिए विजेता क्योंकि पीआईडी ​​द्वारा पहले से चल रही प्रक्रिया में संलग्न किया जा सकता है।
जोसेफ_मोरिस

1
@joseph_morris मुझे यह स्क्रिप्ट भी पसंद है - लेकिन पूर्णता के लिए, आप आसानी से कमांड जारी करके इस सहायक के बिना एक रनिंग (निलंबित, Ctrl-Z) प्रक्रिया से जुड़ सकते हैं fg ‹PID›; mail -s Completed to@example.com <<< 'Message here'
कोनराड रुडोल्फ

1

मेरे पास एक घरेलू स्क्रिप्ट है जो मेरे लिए काम करती है। उपयोग:

mail-after <your command>

यह विषय में सार्थक जानकारी और शरीर में प्रक्रिया के आउटपुट के साथ एक ई-मेल भेजेगा।

GitHub रेपो के मुख्य पृष्ठ पर इंस्टॉलेशन निर्देश हैं - वर्तमान में सभी लिपियों के लिए एक सिमलिंक बनाया गया है ~/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 करो; किया हुआ; गूंज "myprog किया जाता है" | mail -s "प्रक्रिया" mail@example.com
10

0

युग पहले, मैंने इस उपनाम (csh में, मैं अब इसे tsh में उपयोग करता हूं) बनाया:

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

इसके लिए आवश्यक है कि Mailआपके सिस्टम पर इंस्टॉल और काम किया जाए, लेकिन इसका फायदा यह है कि आपकी कमांड ठीक उसी तरह चलती है जैसे कमांड लाइन (एलियासेस, टिल्ड एक्सपेंशन, इत्यादि सहित) से - जब आप किसी काम का उपयोग करते हुए चलाते हैं atया cronयह एक डिफ़ॉल्ट के तहत चलता है। पर्यावरण जो आपकी स्क्रिप्ट को विफल करने या असामान्य आउटपुट प्रदान करने के लिए पर्याप्त रूप से भिन्न हो सकता है (मुझे cronकई बार से काट लिया गया है )

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.