İşlem bittiğinde bana bildirim e-postası gönderebilecek bir program var mı?


46

Hesaplamalı bir bilim insanıyım ve Linux'ta çok uzun hesaplamalar yapıyorum. Spesifik olarak, GROMACS paketini kullanarak moleküler dinamik (MD) simülasyonları kullanıyorum . Bu simülasyonlar günler veya haftalar sürebilir (örneğin, 8 ila 24 çekirdek). Bir kümenin birkaç düğümüne erişime sahibim, bu da herhangi bir zamanda yaklaşık 4 veya 5 iş çalıştırıyorum (her biri farklı bir düğümde ve her biri 8-24 çekirdekte).

Sorun, simülasyonun değişken bir zaman almasıdır. Tüm düğümlerin günün her saatinde simülasyonlar üzerinde çalışmaya devam etmesini seviyorum, ancak yeni bir simülasyon başlatmak için bir terminalle oturum açmam ve bazı el işleri yapmam gerekiyor. Ama bir simülasyonda ne kadar zaman kaldığını her zaman unutuyorum, bu yüzden sürekli olarak onları kontrol ediyorum.

Bir Linux işlemi bittiğinde e-posta alabilmemin bir yolu var mı? Bunu yapan bir Linux programı olabilir mi? Bu şekilde ne zaman bir terminal ile oturum açacağımı ve bir sonraki simülasyonu hazırlayacağımı bilirim.

Ubuntu Linux kullanıyorum. Zaman ayırdığınız için teşekkürler.


3
Bu, zaten başlıkta ele alınan basit bir soru için oldukça uzun ve ilgisiz bir tanımdı. Bunu hep yapıyor musun?
Acumenus

5
@ ABB Bir bilim insanı olarak, "uzun ve ilgisiz" tanımında faydalı bilgiler olduğunu düşünüyorum. Örneğin, el ile terminal çalışmasının gerekli olduğunu biliyoruz ve bu nedenle soruyu sormak için bir neden var. Ek olarak, OP'nin ne yaptığı hakkında bir fikrimiz var, bu yüzden tamamen karanlıkta düşünmüyoruz ve bu nedenle, soruda talep edilmeyen ancak kullanım veya ilgi alanı olabilecek ek bilgiler sağlayabiliyoruz.
user3728501

Yanıtlar:


30

Daemon'a gönderilen işler attamamlandıktan sonra size stderr ve stdout'tan herhangi bir çıktı gönderir. İş çıktısı olmasa bile posta göndermek için de yapılandırılabilir. Ayrıca kontrol terminali olmadan çalıştırma avantajına sahiptir, bu nedenle terminalinizi kapatmanın iş üzerindeki etkisi konusunda endişelenmenize gerek yoktur.

örnek:

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

Bu iş tamamlandığında, işi gönderen kullanıcı bir e-posta alacak ve herhangi bir çıktı varsa onu alacaksınız. LOGNAMEOrtam değişkenini değiştirerek e-posta alıcısını değiştirebilirsiniz .

atSistem meşgul olmadığında çalışmak üzere işleri sıraya alabileceğiniz bir toplu iş moduna sahiptir. Birden fazla kullanıcı kaynaklar için rekabet ederken bu çok iyi bir kuyruk sistemi değil, ancak yine de, onunla iş yapmak istiyorsanız:

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

Varsayılan olarak, işler sistem yükü 1.5'in altında olmadıkça başlamaz, ancak bu yük şekli ayarlanabilir (ve 24 çekirdekliyken söylemeliyim). Loadavg'ı yük sınırının üzerine çarpmazsa (1.5 tekrar tekrar varsayılan) veya loadavg'ı ayrı ayrı 1.5'e çarptığında seri halinde çalışacaklarsa paralel olarak çalışabilirler.

İş kuyruğunu ile görüntüleyebilir ve ile atqişleri silebilirsiniz.atrm

Cevap bağımlılıkları:

  1. Çalışan atddaemon ( ps -ef|grep atd)
  2. İş göndermenize izin verilir atd( /etc/at.deny/ /etc/at.allowyapılandırmalar tarafından reddedilmez )
  3. İşlevsel sendmailMTA

Çoğu sistemin bu gereksinimlerle bir problemi yoktur, ancak kontrol etmeye değer.


49

Evet var

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

Konu "metin" olduğunda, yankı posta göndermek için size bazı Metin postalar verir.


4
mailYerel MTA gerektirir komut düzgün yapılandırılacak. Bu kolay ve basit bir çözümdür.
Ürdün

6
size mailkomutun çıktısını göndermek için de kullanabilirsiniz :{ command; echo Done; } | mail -s "subject" recipient@example.com
glenn jackman 11:12

4
@Andrew Bunun için orjinal komutu koştuğunuz terminalin / kabuğun çalışması için açık kalması gerektiğini unutmayın. screenVeya benzeri bir şey kullanırsanız bu zor olmayabilir tmux, ancak onsuz günler / haftalar boyunca bir terminalin açık olması temkinli olabilir. İle çözüm atiş yönetimi için de bu sorunun çaresine alacaktı.
Caleb

@Caleb Cant &komutunun sonuna bir arkaplanda çalışmasını sağlamak için eklersiniz . sleep 30 && echo "Process done" | mail -s "Process done" mail@domain.tld &
Theo Kouzelis,

@En hayır, yapamazsın. Arka planda bile, süreç hala kabuğunuzun çocuğudur ve kabuk ölürse çocuk işlem bir ölüm sinyali alır. Sen olabilir kullanmak nohuponları bağlantıyı kaldırmak, ama aynı zamanda kabuğundan onu kontrol devam yeteneğini kaybedebilir. Bu kısmen tmuxbunun içindir. Çalışan işlemleri aktif olarak bağlı ve görüntülenen terminal oturumunuzdan boşaltırken, normalde onlarla etkileşime geçmenize izin verir.
Caleb

7

Bir e-posta göndermek için bir python betiği ayarlamanızı tavsiye ederim, kullandığınız hizmet için doğru posta sunucularını yazmak ve yapılandırmak çok kolaydır. Böyle bir şeye benziyorlar:

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

Bunu, diğer cevaplarda önerilen boru operatörü ile birlikte kullanın.

Bu soruna bulduğum bir diğer harika çözüm ise Pushover kullanıyor . Pushover - "Pushover, Android ve iOS cihazlarınıza gerçek zamanlı bildirimler göndermeyi kolaylaştırır." Yaptıklarım bittiğinde telefonuma mesaj göndermesi için kolay bir API olan basit bir komut dosyası hazırlarım.

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

6

Ayrıca trap, işlemden çıktıktan sonra postayla göndermek için ya da kesmede, takılmadan ya da işlemin sonlandırılmasında da komut kullanabilirsiniz. Bu, komut dosyanızın en üstüne yerleştirmeniz gereken koddur.

    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

Koşu


5

Process_watcher.py yazdım

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

Şu anda, e-posta gövdesi şuna benziyor:

PID 18851: /usr/lib/libreoffice/program/soffice.bin - writer - splash-pipe = 5
Başladı: Per, Mar 10 18:33:37 Sona erdi: Per, 10 Mar 18:34:26 (süre 0 : 00: 49)
Bellek (geçerli / en yüksek nokta) - Resident: 155,280 / 155,304 kB Sanal: 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

Herhangi bir geliştirmeye ihtiyacınız varsa GitHub sorununu ortadan kaldırın.


2
Benim için kazanan, PID ile çalışmakta olan bir sürece ekleyebilir.
joseph_morris

1
@joseph_morris Bu betiği de beğendim - ancak tam olması için, komutu vererek bu yardımcı olmadan çalışmakta olan (Ctrl-Z aracılığıyla askıya alınmış) bir işlemi kolayca ekleyebilirsiniz fg ‹PID›; mail -s Completed to@example.com <<< 'Message here'.
Konrad Rudolph


1

Programınızın zaten çalıştığını varsayarsak, izlemek için bash + pgrep komutunu kullanın.

# 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;

Benzer bir şey kullandım: while [[$ (pgrep myprog)]]; 60 uyu; yapılan; echo "Benim program bitti" | mail -s "işlem tamamlandı" mail@example.com
marlar

0

Yıllar önce, bu takma adı oluşturdum (csh'de, şimdi tcsh'de kullanıyorum):

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

O gerektirir Mailyüklü ve sistem üzerinde çalışıyor, ancak komut satırından (vb, takma adlar dahil açılımları tilde) gibi komut tam olarak çalışır avantajı vardır - Kullandığınız bir iş çalıştırdığınızda atveya cronbir varsayılan altında çalışır betiğinizin başarısız olmasına veya olağandışı çıktılar vermesine neden olacak kadar farklı olabilecek ortamlar (bu konuda defalarca ısırıldım cron)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.