Esiste un programma che può inviarmi un'e-mail di notifica al termine di un processo?


46

Sono uno scienziato computazionale e eseguo molti lunghi calcoli su Linux. In particolare, eseguo simulazioni di dinamica molecolare (MD) utilizzando il pacchetto GROMACS. Queste simulazioni possono richiedere giorni o settimane, in esecuzione (ad esempio) da 8 a 24 core. Ho accesso a diversi nodi di un cluster, il che significa che in un dato momento, sto eseguendo circa 4 o 5 lavori (ciascuno su un nodo diverso e ciascuno su 8-24 core).

Il problema è che la simulazione richiede un tempo variabile. Mi piace mantenere tutti i nodi funzionanti su simulazioni 24 ore su 24, ma per iniziare una nuova simulazione, devo fare il login con un terminale e fare un po 'di lavoro manuale. Ma dimentico sempre quanto tempo rimane in una simulazione, quindi finisco sempre per controllarli.

È possibile ricevere un'e-mail al termine di un processo Linux? Potrebbe esserci un programma Linux che fa questo? In questo modo saprei quando accedere con un terminale e preparare la simulazione successiva.

Sto usando Ubuntu Linux. Grazie per il tuo tempo.


3
Era una descrizione piuttosto lunga e irrilevante per una semplice domanda che era già coperta nel titolo. Lo fai sempre?
Acumenus,

5
@ABB Come scienziato ritengo che ci siano informazioni utili nella descrizione "lunga e irrilevante". Ad esempio, sappiamo che è necessario un lavoro manuale sui terminali e quindi c'è una ragione per porre la domanda. Inoltre, abbiamo qualche idea su cosa stia facendo l'OP, quindi non stiamo pensando totalmente al buio e potremmo quindi essere in grado di fornire informazioni aggiuntive che non sono richieste nella domanda ma potrebbero essere utili o interessanti.
user3728501

Risposte:


30

I lavori inviati al atdemone ti invieranno qualsiasi output da stderr e stdout al completamento. Può anche essere configurato per inviare posta anche se il lavoro non ha output. Ha anche il vantaggio di funzionare senza un terminale di controllo, quindi non devi preoccuparti dell'effetto che la chiusura del tuo terminale avrà sul lavoro.

esempio:

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

Al termine di questo lavoro, l'utente che ha inviato il lavoro riceverà un'e-mail e se è presente alcun output, lo riceverai. È possibile modificare il destinatario dell'e-mail modificando la LOGNAMEvariabile di ambiente.

atha una modalità batch in cui è possibile accodare i lavori da eseguire quando il sistema non è occupato. Questo non è un ottimo sistema di accodamento quando più utenti sono in competizione per risorse, ma comunque, se si desidera eseguire lavori con esso:

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

Per impostazione predefinita, i lavori non verranno avviati a meno che il carico del sistema non sia inferiore a 1,5, ma tale cifra di carico può essere regolata (e con 24 core direi che dovresti). Possono funzionare in parallelo se non eseguono il bump del loadavg oltre il limite di carico (1.5 di nuovo di default) o se eseguono il bump del loadavg singolarmente su 1.5, verranno eseguiti in serie.

È possibile visualizzare la coda dei lavori con atqed eliminare i lavori conatrm

Rispondi alle dipendenze:

  1. Esecuzione di atddaemon ( ps -ef|grep atd)
  2. Puoi inviare lavori a atd(non negato da /etc/at.deny/ /etc/at.allowconfigurazioni)
  3. sendmailMTA funzionale

La maggior parte dei sistemi non ha problemi con questi requisiti, ma vale la pena verificarli.


49

Sì, c'è

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

Dove "testo" è l'oggetto, l'eco fornisce alla posta del testo da inviarti.


4
Il mailcomando richiede che l'MTA locale sia configurato correttamente. Questa è la soluzione facile e semplice.
Giordania,

6
puoi anche usare mailper inviarti l'output del comando:{ command; echo Done; } | mail -s "subject" recipient@example.com
glenn jackman,

4
@Andrew Tenere presente che per far funzionare il terminale / shell in cui è stato eseguito il comando originale deve rimanere aperto. Questo potrebbe non essere difficile se si utilizza qualcosa di simile screeno tmux, ma potrebbe essere delicato avere un terminale aperto da qualche parte per giorni / settimane senza di esso. La soluzione con atper la gestione del lavoro si occuperebbe anche di quel problema.
Caleb,

@Caleb Non puoi aggiungere &a alla fine del comando per farlo funzionare in background . sleep 30 && echo "Process done" | mail -s "Process done" mail@domain.tld &
Theo Kouzelis,

@Theo no non puoi. Anche in background il processo è ancora figlio della tua shell e se la shell muore il processo figlio riceverà un segnale di uccisione. È possibile utilizzare nohupper scollegarli, ma si perde anche la capacità di continuare a controllarlo dalla shell. Questo è in parte ciò che tmuxserve. Separa i processi in esecuzione dalla sessione terminale attivamente connessa e visualizzata, lasciando comunque interagire con essi normalmente.
Caleb,

7

Consiglierei di impostare uno script Python per inviare un'e-mail, sono molto facili da scrivere e configurare i server di posta corretti per qualunque servizio tu usi. Sembrano qualcosa del genere:

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

Usalo insieme all'operatore di pipa suggerito nelle altre risposte.

Un'altra grande soluzione che ho riscontrato a questo problema è l'utilizzo di Pushover . Pushover: "Pushover semplifica l'invio di notifiche in tempo reale ai dispositivi Android e iOS." Ho installato un semplice script che ha perfezionato l'API semplice per inviare un messaggio al mio telefono al termine delle build.

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

6

Puoi anche usare il trapcomando per inviare posta all'uscita del processo, o al momento dell'interruzione, del riaggancio o al termine del processo. Ecco il codice che devi posizionare in cima allo script.

    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

Arun


5

Ho scritto process_watcher.py

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

Attualmente, il corpo dell'email appare come:

PID 18851: /usr/lib/libreoffice/program/soffice.bin --writer --splash-pipe = 5
Iniziato: gio 10 mar 18:33:37 Terminato: gio 10 mar 18:34:26 (durata 0 : 00: 49)
Memoria (corrente / picco) - Residente: 155.280 / 155.304 kB Virtuale: 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

Crea un problema con GitHub se hai bisogno di miglioramenti.


2
Vincitore per me perché può collegarsi tramite PID a un processo già in esecuzione.
joseph_morris,

1
@joseph_morris Mi piace anche questo script - ma per completezza, puoi facilmente collegarti a un processo in esecuzione (sospeso, tramite Ctrl-Z) senza questo aiuto inviando il comando fg ‹PID›; mail -s Completed to@example.com <<< 'Message here'.
Konrad Rudolph,

1

Ho una sceneggiatura casalinga che funziona per me. Uso:

mail-after <your command>

Invierà un'e-mail con informazioni significative nell'oggetto e con l'output del processo nel corpo.

Le istruzioni di installazione si trovano sulla pagina principale del repository GitHub - attualmente per tutti gli script in cui viene creato un collegamento simbolico ~/bin.


1

Supponendo che il tuo programma sia già in esecuzione, usa bash + pgrep per guardarlo.

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

Ho usato qualcosa di simile: while [[$ (pgrep myprog)]]; dormire 60; fatto; echo "myprog is done" | mail -s "process done" mail@example.com
marzo

0

Evo fa, ho creato questo alias (in csh, ora lo uso in tcsh):

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

Richiede che Mailsia installato e funzionante sul tuo sistema, ma ha il vantaggio che il tuo comando viene eseguito esattamente come dalla riga di comando (inclusi alias, espansioni tilde, ecc.) - quando esegui un lavoro usando ato cronviene eseguito in modo predefinito ambiente che potrebbe essere sufficientemente diverso da causare errori nello script o fornire risultati insoliti (ne sono stato morso da cronmolte volte)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.