Apakah ada program yang dapat mengirimi saya email pemberitahuan ketika suatu proses selesai?

46

Saya seorang ilmuwan komputasi, dan saya menjalankan banyak perhitungan yang panjang di Linux. Secara khusus, saya menjalankan simulasi dinamika molekul (MD) menggunakan paket GROMACS. Simulasi ini dapat berlangsung berhari-hari atau berminggu-minggu, berjalan pada (misalnya) 8 hingga 24 core. Saya memiliki akses ke beberapa node cluster, yang berarti bahwa pada waktu tertentu, saya menjalankan sekitar 4 atau 5 pekerjaan (masing-masing pada node yang berbeda, dan masing-masing pada 8-24 core).

Masalahnya adalah simulasi membutuhkan waktu variabel. Saya suka menjaga semua node bekerja pada simulasi sepanjang waktu, tetapi untuk memulai simulasi baru, saya perlu melakukan login dengan terminal dan melakukan beberapa pekerjaan manual. Tapi saya selalu lupa berapa banyak waktu yang tersisa dalam simulasi, jadi saya selalu berakhir memeriksa mereka.

Apakah ada cara saya bisa menerima email ketika proses Linux selesai? Mungkinkah ada program Linux yang melakukan ini? Dengan begitu saya akan tahu kapan harus login dengan terminal dan menyiapkan simulasi selanjutnya.

Saya menggunakan Ubuntu Linux. Terima kasih atas waktunya.

Andrew
sumber
3
Itu deskripsi yang agak panjang dan tidak relevan untuk pertanyaan sederhana yang sudah tercakup dalam judul. Apakah kamu selalu melakukan ini?
Acumenus
5
@ABB Sebagai seorang ilmuwan saya menganggap ada informasi yang berguna dalam deskripsi "panjang dan tidak relevan". Misalnya, kita tahu bahwa pekerjaan terminal manual diperlukan dan karenanya ada alasan untuk mengajukan pertanyaan. Selain itu kami memiliki beberapa gagasan tentang apa yang OP lakukan sehingga kami tidak berpikir sepenuhnya dalam kegelapan dan karenanya dapat memberikan informasi tambahan yang tidak diminta dalam pertanyaan tetapi mungkin bermanfaat atau menarik.
user3728501

Jawaban:

30

Pekerjaan yang dikirimkan ke atdaemon akan mengirimkan output kepada Anda dari stderr dan stdout setelah selesai. Itu juga dapat dikonfigurasi untuk mengirim email bahkan jika pekerjaan itu tidak memiliki output. Ini juga memiliki keuntungan berjalan tanpa terminal pengendali, jadi Anda tidak perlu khawatir tentang efek penutupan terminal terhadap pekerjaan.

contoh:

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

Ketika pekerjaan ini selesai, pengguna yang mengirimkan pekerjaan akan menerima email, dan jika ada output sama sekali, Anda akan menerimanya. Anda dapat mengubah penerima email dengan mengubah LOGNAMEvariabel lingkungan.

atmemiliki mode batch di mana Anda dapat mengantre pekerjaan untuk dijalankan ketika sistem tidak sibuk. Ini bukan sistem antrian yang sangat bagus ketika banyak pengguna bersaing memperebutkan sumber daya, tetapi jika Anda ingin menjalankan pekerjaan dengannya:

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

Secara default pekerjaan tidak akan dimulai kecuali jika beban sistem di bawah 1,5, tetapi angka beban itu dapat disesuaikan (dan dengan 24 core saya katakan Anda harus). Mereka dapat berjalan secara paralel jika mereka tidak menundukkan loadavg di atas batas beban (1,5 default lagi), atau jika mereka secara individu menundukkan loadavg lebih dari 1,5, mereka akan berjalan secara serial.

Anda dapat melihat antrian pekerjaan dengan atq, dan menghapus pekerjaan denganatrm

Dependensi jawaban:

  1. Running atddaemon ( ps -ef|grep atd)
  2. Anda diizinkan mengirimkan pekerjaan ke atd(tidak ditolak oleh /etc/at.deny/ /etc/at.allowkonfigurasi)
  3. sendmailMTA fungsional

Sebagian besar sistem tidak memiliki masalah dengan persyaratan ini, tetapi ada baiknya untuk memeriksa.

Jodie C
sumber
49

Ya ada

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

Di mana -s "teks" adalah subjek, gema memberikan mail beberapa Teks untuk dikirim kepada Anda

Bonsi Scott
sumber
4
The mailperintah tidak memerlukan MTA lokal untuk dikonfigurasi dengan benar. Ini adalah solusi yang mudah dan sederhana.
jordanm
6
Anda juga dapat menggunakan mailuntuk mengirimkan kepada Anda output dari perintah:{ command; echo Done; } | mail -s "subject" [email protected]
glenn jackman
4
@Andrew Perlu diketahui bahwa agar terminal / shell Anda berfungsi, Anda menjalankan perintah asli harus tetap terbuka. Ini mungkin tidak sulit jika Anda menggunakan sesuatu seperti screenatau tmux, tetapi mungkin sensitif untuk memiliki terminal terbuka di suatu tempat selama berhari-hari / minggu tanpa itu. The solusi dengan atmanajemen pekerjaan juga akan mengurus masalah itu.
Caleb
@ Caleb Anda tidak dapat menambahkan &di akhir perintah untuk menjalankannya di latar belakang. sleep 30 && echo "Process done" | mail -s "Process done" [email protected] &
Theo Kouzelis
@Tidak, kamu tidak bisa. Bahkan di latar belakang proses itu masih anak dari cangkang Anda dan jika cangkang mati proses anak akan menerima sinyal membunuh. Anda dapat menggunakannya nohupuntuk memutuskan tautannya, tetapi Anda juga kehilangan kemampuan untuk terus mengendalikannya dari shell. Ini sebagian untuk apa tmux. Ini menceraikan proses yang berjalan dari sesi terminal Anda yang terhubung secara aktif dan dilihat sambil tetap membiarkan Anda berinteraksi dengan mereka secara normal.
Caleb
7

Saya akan merekomendasikan pengaturan skrip python untuk mengirim email, mereka sangat mudah untuk menulis dan mengkonfigurasi server mailing yang benar untuk layanan apa pun yang Anda gunakan. Mereka terlihat seperti ini:

#!/usr/bin/python

import smtplib

sender = '[email protected]'
receivers = ['[email protected]']

message = """From: From Person <[email protected]>
To: To Person <[email protected]>
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"

Gunakan ini bersamaan dengan operator pipa yang disarankan dalam jawaban lain.

Solusi hebat lain yang saya temukan untuk masalah ini adalah menggunakan Pushover . Pushover - "Pushover membuatnya mudah untuk mengirim notifikasi real-time ke perangkat Android dan iOS Anda." Saya menyiapkan skrip sederhana yang memberikan API mudah untuk mengirim pesan ke ponsel saya ketika build saya selesai.

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

Anda juga dapat menggunakan trapperintah untuk mengirim email saat keluar dari proses, atau pada saat interupsi, hangup atau pada penghentian proses. Berikut adalah kode yang harus Anda tempatkan di bagian atas skrip Anda.

    trap 'mail -s "Process done" [email protected]' exit # It will mail on normal exit
    trap 'mail -s "Process interrupted" [email protected]' INT HUP# it will mail on interrupt or hangup  of the process

Arun

pengguna1678213
sumber
5

Saya menulis process_watcher.py

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

Saat ini, badan email terlihat seperti:

PID 18851: /usr/lib/libreoffice/program/soffice.bin --writer --splash-pipe = 5
Dimulai: Kam, 10 Mar 18:33:37 Berakhir: Kam, 10 Mar 18:34:26 (durasi 0 : 00: 49)
Memori (saat ini / puncak) - Penduduk: 155.280 / 155.304 kB Virtual: 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

Hentikan masalah GitHub jika Anda membutuhkan perbaikan.

Arlo
sumber
2
Pemenang bagi saya karena dapat dilampirkan oleh PID ke proses yang sudah berjalan.
joseph_morris
1
@joseph_morris Saya juga suka skrip ini - tetapi untuk kelengkapannya, Anda dapat dengan mudah melampirkan proses yang berjalan (ditangguhkan, melalui Ctrl-Z) tanpa bantuan ini dengan mengeluarkan perintah fg ‹PID›; mail -s Completed [email protected] <<< 'Message here'.
Konrad Rudolph
1

Saya memiliki skrip buatan sendiri yang berfungsi untuk saya. Pemakaian:

mail-after <your command>

Ini akan mengirim email dengan informasi yang bermakna dalam subjek, dan dengan output proses di dalam tubuh.

Petunjuk instalasi ada di halaman utama repo GitHub - saat ini untuk semua skrip tempat symlink dibuat ~/bin.

krlmlr
sumber
1

Dengan asumsi program Anda sudah berjalan, gunakan bash + pgrep untuk menontonnya.

# 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;
Matt Callaway
sumber
Saya menggunakan sesuatu yang serupa: while [[$ (pgrep myprog)]]; tidur 60; Selesai; gema "myprog is done" | mail -s "process done" [email protected]
marlar
0

Berabad-abad yang lalu, saya membuat alias ini (di csh, saya sekarang menggunakannya di tcsh):

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

Itu mengharuskan yang Maildiinstal dan bekerja pada sistem Anda, tetapi memiliki keuntungan bahwa perintah Anda berjalan persis seperti dari baris perintah (termasuk alias, ekspansi tilde, dll) - ketika Anda menjalankan pekerjaan menggunakan atatau cronberjalan di bawah default lingkungan yang mungkin cukup berbeda untuk menyebabkan skrip Anda gagal atau memberikan hasil yang tidak biasa (saya sudah sering digigit oleh itu cron)

barrycarter
sumber