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

46

Sou um cientista computacional e faço muitos cálculos longos no Linux. Especificamente, eu executo simulações de dinâmica molecular (MD) usando o pacote GROMACS. Essas simulações podem levar dias ou semanas, rodando (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 a 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 iniciar uma nova simulação, preciso fazer login com um terminal e fazer algum trabalho manual. Mas eu sempre esqueço quanto tempo resta em uma simulação, então sempre acabo verificando-os constantemente.

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

Estou usando o Ubuntu Linux. Obrigado pelo seu tempo.

Andrew
fonte
3
Essa foi uma descrição bastante longa e irrelevante para uma pergunta simples que já estava coberta no título. Você sempre faz isso?
Acumenos
5
@ABB Como cientista, considero que existem informações úteis na descrição "longa e irrelevante". Por exemplo, sabemos que o trabalho manual do terminal é necessário e, portanto, há uma razão para fazer a pergunta. Além disso, temos alguma idéia do que o OP está fazendo, por isso não pensamos totalmente no escuro e, portanto, podemos fornecer informações adicionais que não são solicitadas na pergunta, mas que podem ser úteis ou interessantes.
user3728501

Respostas:

30

Os trabalhos enviados ao atdaemon enviarão qualquer saída para você do stderr e stdout após a conclusão. Também pode ser configurado para enviar correio, mesmo que o trabalho não tenha saída. Ele também tem o benefício de funcionar sem um terminal de controle, para que você não precise se preocupar com o efeito que o fechamento do 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 o enviou receberá um email e, se houver alguma saída, você o receberá. Você pode alterar o destinatário do email alterando a LOGNAMEvariável de ambiente.

atpossui um modo em lote no qual você pode enfileirar tarefas para executar quando o sistema não estiver ocupado. Esse não é um sistema de enfileiramento muito bom quando vários usuários estão competindo por recursos, mas, mesmo assim, se você deseja 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 número de carga pode ser ajustado (e com 24 núcleos, eu diria que você deveria). Eles podem ser executados em paralelo se não ultrapassarem o loadavg acima do limite de carga (o padrão é 1.5 novamente) ou se eles ultrapassarem o loadavg acima de 1,5, eles serão executados em série.

Você pode visualizar a fila de trabalhos atqe excluir trabalhos comatrm

Dependências da resposta:

  1. Executando atddaemon ( ps -ef|grep atd)
  2. Você tem permissão para enviar tarefas para atd(não negadas por /etc/at.deny/ /etc/at.allowconfigurações)
  3. sendmailMTA funcional

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

Jodie C
fonte
49

Sim, existe

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

Onde -s "texto" é o assunto, o eco fornece ao correio algum texto para enviar a você.

Bonsi Scott
fonte
4
O mailcomando exige que o MTA local seja configurado corretamente. Esta é a solução fácil e simples.
Jordanm
6
você também pode usar mailpara enviar a saída do comando:{ command; echo Done; } | mail -s "subject" [email protected]
glenn jackman 11/11/12
4
@Andrew Esteja ciente de que, para que isso funcione, o terminal / shell em que você executou o comando original deve permanecer aberto. Pode não ser difícil se você usar algo como screenou tmux, mas pode ser difícil ter um terminal aberto em algum lugar por dias / semanas sem ele. A solução atpara o gerenciamento de tarefas também resolveria esse problema.
Caleb
Caleb @ Você não pode adicionar um &no final do comando para fazê-lo funcionar no fundo. sleep 30 && echo "Process done" | mail -s "Process done" [email protected] &
Theo Kouzelis
@Theo não, você não pode. Mesmo em segundo plano, o processo ainda é filho do seu shell e, se o shell morrer, o processo filho receberá um sinal de interrupção. Você pode usar nohuppara desvinculá-los, mas também perde a capacidade de continuar controlando-o a partir do shell. Isto é parcialmente o que tmuxé para isso. Ele separa os processos em execução da sua sessão de terminal ativamente conectada e visualizada, enquanto ainda permite que você interaja com eles normalmente.
Caleb
7

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

#!/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 do tubo sugerido nas outras respostas.

Outra ótima solução que encontrei para esse problema está usando o 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 alterou a API fácil para enviar uma mensagem para o meu telefone quando minhas compilações terminarem.

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
fonte
6

Você também pode usar o trapcomando para enviar e-mails na saída do processo ou na interrupção, interrupção ou no término do processo. Aqui está o código que você deve colocar na parte superior 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

Uma corrida

user1678213
fonte
5

Eu escrevi process_watcher.py

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

Atualmente, o corpo do email se parece com:

PID 18851: /usr/lib/libreoffice/program/soffice.bin --writer --splash-pipe = 5
Iniciado: quinta-feira, 10 de março 18:33:37 Finalizado: quinta-feira, 10 de mar 18:34:26 : 00: 49)
Memória (atual / pico) - Residente: 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

Crie um problema no GitHub se precisar de melhorias.

Arlo
fonte
2
Vencedor para mim porque pode anexar por PID a um processo já em execução.
Joseph_morris 9/09/16
1
@joseph_morris I como este script também - mas para ser completo, você pode facilmente anexar a um processo em execução (suspensa, via Ctrl-Z) sem este ajudante emitindo o comando fg ‹PID›; mail -s Completed [email protected] <<< 'Message here'.
Konrad Rudolph
1

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

mail-after <your command>

Ele enviará um e-mail com informações significativas no 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 GitHub - atualmente para todos os scripts nos quais um link simbólico é criado ~/bin.

krlmlr
fonte
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
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
fonte
Eu usei algo semelhante: while [[$ (pgrep myprog)]]; dorme 60; feito; eco "myprog está feito" | mail -s "processo concluído" [email protected]
marlar 11/11/18
0

Há tempos, criei esse alias (no csh, agora o uso no tcsh):

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

Requer que Mailesteja instalado e funcionando no seu sistema, mas tem a vantagem de que seu comando seja executado exatamente como faria na linha de comando (incluindo aliases, expansões de til, etc) - quando você executa uma tarefa usando atou croné executada sob um padrão ambiente que pode ser suficientemente diferente para causar falha no seu script ou fornecer saída incomum (eu já fui mordido por isso cronvárias vezes)

barrycarter
fonte