Existe algum programa que possa me enviar um email de notificação quando um processo terminar?

42

Eu sou um cientista computacional e executo muitos cálculos demorados no Linux. Especificamente, executo simulações de dinâmica molecular (MD) usando o pacote GROMACS. Essas simulações podem levar dias ou semanas, sendo executadas (por exemplo) 8 a 24 núcleos. Eu tenho acesso a vários nós de um cluster, o que significa que, a qualquer momento, estou executando aproximadamente 4 ou 5 trabalhos (cada um em um nó diferente e cada um em 8-24 núcleos).

O problema é que a simulação leva um tempo variável. Eu gosto de manter todos os nós trabalhando em simulações o tempo todo, mas para começar uma nova simulação, eu preciso fazer o login com um terminal e fazer algum trabalho manual. Mas eu sempre esqueço quanto tempo resta em uma simulação, então eu sempre acabo verificando-os constantemente.

Existe alguma maneira de eu receber um email quando um processo do Linux terminar? Poderia haver um programa Linux que faz isso? Dessa forma, eu saberia quando fazer o login com um terminal e preparar a próxima simulação.

Estou usando o Ubuntu Linux. Obrigado pelo seu tempo.

    
por Andrew 10.11.2012 / 21:55

8 respostas

27

As tarefas enviadas para o daemon at enviarão qualquer saída para você de stderr e stdout após a conclusão. Também pode ser configurado para enviar e-mail, mesmo que o trabalho não tenha saída. Ele também tem o benefício de rodar sem um terminal de controle, então você não precisa se preocupar com o efeito que o fechamento do seu terminal terá no trabalho.

exemplo:

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

Quando esse trabalho for concluído, o usuário que enviou o trabalho receberá um email e, se houver algum resultado, você o receberá. Você pode alterar o destinatário do email alterando a variável de ambiente LOGNAME .

at tem um modo em lotes no qual você pode colocar trabalhos em fila para serem executados quando o sistema não está ocupado. Esse não é um sistema de filas muito bom quando vários usuários estão competindo por recursos, mas, mesmo assim, se você quiser executar trabalhos com ele:

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

Por padrão, os trabalhos não serão iniciados a menos que a carga do sistema esteja abaixo de 1,5, mas esse valor de carga pode ser ajustado (e com 24 núcleos eu diria que você deveria). Eles podem rodar em paralelo se eles não fizerem o loadavg ultrapassar o limite de carga (1.5 padrão novamente), ou se eles individualmente aumentarem o loadavg acima de 1.5, eles rodarão em serial.

Você pode ver a fila de trabalhos com atq e excluir trabalhos com atrm

Depender de dependências:

  1. Executando atd daemon ( ps -ef|grep atd )
  2. Você tem permissão para enviar trabalhos para atd (não negado por /etc/at.deny / /etc/at.allow configurações)
  3. Funcional sendmail MTA

A maioria dos sistemas não tem problemas com esses requisitos, mas vale a pena verificar.

    
por 10.11.2012 / 22:21
47

Sim, existe

command; echo "Process done" | mail -s "Process done" [email protected]

Onde -s "texto" é o assunto, o eco dá ao correio algum Texto para enviar para você.

    
por 10.11.2012 / 21:56
6

Você também pode usar o comando trap para enviar e-mails na saída do processo, ou na interrupção, interrupção ou no encerramento do processo. Aqui está o código que você deve colocar no topo do seu script.

    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

    
por 12.11.2012 / 20:48
5

Eu recomendaria definir um script python para enviar um email, eles são muito fáceis de escrever e configurar os servidores de email corretos para qualquer serviço que você usa. Eles se parecem com algo assim:

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

Use isso em conjunto com o operador de pipe sugerido nas outras respostas.

Outra ótima solução que encontrei para esse problema é usar Pushover . Pushover - "O Pushover facilita o envio de notificações em tempo real para seus dispositivos Android e iOS". Eu configurei um script simples que usava a API fácil para enviar uma mensagem para o meu telefone quando minhas compilações são feitas.

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

Eu escrevi process_watcher.py

process_watcher --pid 1234 --to [email protected]

Atualmente, o corpo do e-mail parece com:

PID 18851: /usr/lib/libreoffice/program/soffice.bin --writer --splash-pipe=5
Started: Thu, Mar 10 18:33:37 Ended: Thu, Mar 10 18:34:26 (duration 0:00:49)
Memory (current/peak) - Resident: 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 [email protected] --to [email protected]

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

Cite um problema no GitHub se precisar de melhorias.

    
por 11.03.2016 / 05:12
1

Eu tenho um script caseiro que funciona para mim. Uso:

mail-after <your command>

Ele enviará um e-mail com informações significativas sobre o assunto e com a saída do processo no corpo.

As instruções de instalação estão na página principal do repositório do GitHub - atualmente, para todos os scripts, um link simbólico é criado em ~/bin .

    
por 20.03.2015 / 12:01
1

Supondo que seu programa já esteja em execução, use o bash + pgrep para assisti-lo.

# Check that "pgrep $PROGRAM" returns the rid PID.
PROGRAM=foo
[email protected]
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;
    
por 24.02.2018 / 17:43
0

Há séculos, eu criei esse alias (em csh, agora o uso em tcsh):

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

Requer que Mail esteja instalado e funcionando em seu sistema, mas tem a vantagem de seu comando ser executado exatamente como na linha de comando (incluindo aliases, expansões de til, etc) - quando você executa um trabalho usando at ou cron é executado em um ambiente padrão que pode ser suficientemente diferente para causar falha no seu script ou fornecer saída incomum (fui mordido por cron muitas vezes)

    
por 08.12.2016 / 15:54