Czy istnieje program, który może wysłać mi powiadomienie e-mail o zakończeniu procesu?


46

Jestem naukowcem obliczeniowym i przeprowadzam wiele długich obliczeń w systemie Linux. W szczególności prowadzę symulacje dynamiki molekularnej (MD) przy użyciu pakietu GROMACS. Te symulacje mogą trwać kilka dni lub tygodni, wykorzystując (na przykład) od 8 do 24 rdzeni. Mam dostęp do kilku węzłów klastra, co oznacza, że ​​w danym momencie uruchamiam około 4 lub 5 zadań (każde na innym węźle i każdy na 8–24 rdzeniach).

Problem polega na tym, że symulacja zajmuje zmienną ilość czasu. Lubię, aby wszystkie węzły pracowały nad symulacjami przez całą dobę, ale aby rozpocząć nową symulację, muszę zalogować się przy użyciu terminala i wykonać trochę pracy ręcznej. Ale zawsze zapominam, ile czasu pozostało w symulacji, więc zawsze kończę na ciągłym sprawdzaniu ich.

Czy jest jakiś sposób na otrzymanie wiadomości e-mail po zakończeniu procesu Linux? Czy może istnieć program Linux, który to robi? W ten sposób wiedziałbym, kiedy zalogować się do terminala i przygotować następną symulację.

Używam Ubuntu Linux. Dziękuję za Twój czas.


3
Był to dość długi i nieistotny opis prostego pytania, które było już ujęte w tytule. Czy zawsze to robisz?
Acumenus,

5
@ABB Jako naukowiec uważam za przydatne informacje w opisie „długim i nieistotnym”. Na przykład wiemy, że wymagana jest ręczna praca terminala, dlatego istnieje powód, aby zadać pytanie. Ponadto mamy pewne pojęcie o tym, co robi OP, więc nie myślimy całkowicie w ciemności i dlatego możemy być w stanie dostarczyć dodatkowe informacje, które nie są wymagane w pytaniu, ale mogą być przydatne lub interesujące.
user3728501

Odpowiedzi:


30

Zadania przesłane do atdemona wyślą do ciebie wszelkie dane wyjściowe ze stderr i stdout po zakończeniu. Można go również skonfigurować do wysyłania poczty, nawet jeśli zadanie nie ma danych wyjściowych. Ma również tę zaletę, że działa bez terminala sterującego, więc nie musisz się martwić o wpływ, jaki zamknięcie terminala będzie miało na zadanie.

przykład:

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

Po zakończeniu tego zadania użytkownik, który je przesłał, otrzyma wiadomość e-mail, a jeśli w ogóle będzie jakaś informacja wyjściowa, otrzymasz ją. Możesz zmienić adresata wiadomości e-mail, zmieniając LOGNAMEzmienną środowiskową.

atma tryb wsadowy, w którym można kolejkować zadania do uruchomienia, gdy system nie jest zajęty. Nie jest to zbyt dobry system kolejkowania, gdy wielu użytkowników walczy o zasoby, ale mimo to, jeśli chcesz uruchamiać z nim zadania:

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

Domyślnie zadania nie rozpoczną się, chyba że obciążenie systemu spadnie poniżej 1,5, ale wartość obciążenia można dostosować (i przy 24 rdzeniach powiedziałbym, że powinieneś). Mogą działać równolegle, jeśli nie podniosą loadavg powyżej limitu obciążenia (ponownie domyślnie 1.5), lub jeśli indywidualnie podniosą loadavg powyżej 1,5, będą działać szeregowo.

Możesz przeglądać kolejkę zadań za pomocą atqi usuwać zadania za pomocąatrm

Zależności odpowiedzi:

  1. Uruchamianie atddemona ( ps -ef|grep atd)
  2. Możesz przesyłać zadania do atd(nie odmowa przez /etc/at.deny/ /etc/at.allowkonfiguracje)
  3. Funkcjonalny sendmailMTA

Większość systemów nie ma problemu z tymi wymaganiami, ale warto to sprawdzić.


49

Tak, jest

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

Gdzie tematem jest „tekst”, echo daje wiadomości e-mail tekst do wysłania.


4
mailKomenda wymaga lokalnego MTA być prawidłowo skonfigurowany. To łatwe i proste rozwiązanie.
Jordan

6
możesz również użyć maildo przesłania wyniku polecenia:{ command; echo Done; } | mail -s "subject" recipient@example.com
glenn jackman 11.11.12

4
@Andrew Należy pamiętać, że aby to działało, terminal / powłoka, w której uruchomiono oryginalne polecenie, musi pozostać otwarte. To może nie być trudne, jeśli używasz czegoś takiego jak screenlub tmux, ale może być drażliwe, aby mieć terminal otwarty gdzieś przez kilka dni / tygodni bez niego. Rozwiązanie problemu atzarządzania zadaniami rozwiązałoby również ten problem.
Caleb

@Caleb Cant dodajesz &na końcu polecenia, aby działało w tle. sleep 30 && echo "Process done" | mail -s "Process done" mail@domain.tld &
Theo Kouzelis,

@ Nie, nie możesz. Nawet w tle proces nadal jest potomkiem twojej powłoki i jeśli powłoka umrze, proces potomny otrzyma sygnał zabicia. Państwo mogli wykorzystywać nohupje rozłączyć, ale też stracić zdolność do dalszego kontrolowania go z muszli. Po to częściowo tmuxjest. Oddziela uruchomione procesy od aktywnie połączonej i oglądanej sesji terminalu, jednocześnie umożliwiając normalną interakcję z nimi.
Caleb

7

Polecam ustawienie skryptu python do wysyłania wiadomości e-mail, bardzo łatwo jest napisać i skonfigurować odpowiednie serwery pocztowe dla dowolnej usługi, z której korzystasz. Wyglądają mniej więcej tak:

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

Użyj tego w połączeniu z operatorem potoku sugerowanym w innych odpowiedziach.

Innym świetnym rozwiązaniem, które znalazłem dla tego problemu, jest użycie Pushover . Pushover - „Pushover ułatwia wysyłanie powiadomień w czasie rzeczywistym na urządzenia z Androidem i iOS”. Skonfigurowałem prosty skrypt, który zoptymalizował łatwy interfejs API do wysyłania wiadomości na mój telefon po zakończeniu kompilacji.

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

6

Możesz także użyć trappolecenia do wysyłania poczty przy wyjściu z procesu, przerwie, rozłączeniu lub zakończeniu procesu. Oto kod, który musisz umieścić na górze skryptu.

    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

Bieg


5

Napisałem process_watcher.py

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

Obecnie treść wiadomości e-mail wygląda następująco:

PID 18851: /usr/lib/libreoffice/program/soffice.bin --writer --splash-pipe = 5
Rozpoczęty: czw, 10 marca 18:33:37 Zakończony: czw, 10 marca 18:34:26 (czas trwania 0 : 00: 49)
Pamięć (bieżąca / szczytowa) - rezydent: 155.280 / 155.304 kB Wirtualny: 1.168.968 / 1.118.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

Rozwiąż problem GitHub, jeśli potrzebujesz ulepszeń.


2
Zwycięzca dla mnie, ponieważ może dołączyć PID do już działającego procesu.
joseph_morris

1
@ joseph_morris Podoba mi się również ten skrypt - ale dla kompletności możesz łatwo dołączyć do działającego (zawieszonego przez Ctrl-Z) procesu bez tego pomocnika, wydając polecenie fg ‹PID›; mail -s Completed to@example.com <<< 'Message here'.
Konrad Rudolph,

1

Mam domowy skrypt, który działa dla mnie. Stosowanie:

mail-after <your command>

Wyśle wiadomość e-mail z istotnymi informacjami na temat oraz z danymi wyjściowymi procesu w treści.

Instrukcje instalacji znajdują się na stronie głównej repozytorium GitHub - obecnie dla wszystkich skryptów tworzone jest dowiązanie symboliczne ~/bin.


1

Zakładając, że twój program już działa, użyj bash + pgrep, aby go obejrzeć.

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

Użyłem czegoś podobnego: while [[$ (pgrep myprog)]]; śpij 60; gotowy; echo „myprog jest gotowy” | mail -s „proces zakończony” mail@example.com
marzec

0

Wiele lat temu utworzyłem ten alias (w csh, teraz używam go w tcsh):

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

Wymaga to Mailzainstalowania i działania w systemie, ale ma tę zaletę, że polecenie działa dokładnie tak samo, jak w wierszu poleceń (w tym aliasy, rozszerzenia tyldy itp.) - gdy uruchamiasz zadanie przy użyciu atlub crondziała domyślnie środowisko, które może być wystarczająco różne, aby spowodować awarię skryptu lub zapewnić nietypowe dane wyjściowe (byłem ugryziony przez to cronwiele razy)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.