프로세스가 완료되면 알림 이메일을 보낼 수있는 프로그램이 있습니까?


46

나는 계산 과학자이며 Linux에서 많은 계산을 수행합니다. 특히 GROMACS 패키지를 사용하여 분자 역학 (MD) 시뮬레이션을 실행 합니다. 이러한 시뮬레이션은 8 ~ 24 개의 코어에서 실행되는 데 며칠 또는 몇 주가 걸릴 수 있습니다. 클러스터의 여러 노드에 액세스 할 수 있습니다. 즉, 주어진 시간에 약 4 또는 5 개의 작업 (각각 다른 노드에서 각각 8-24 코어에서)을 실행하고 있음을 의미합니다.

문제는 시뮬레이션에 다양한 시간이 걸린다는 것입니다. 모든 노드를 24 시간 내내 시뮬레이션 작업을 유지하고 싶지만 새 시뮬레이션을 시작하려면 터미널에 로그인하여 수동 작업을 수행해야합니다. 그러나 시뮬레이션에 남은 시간이 항상 잊어 버려서 항상 지속적으로 확인합니다.

Linux 프로세스가 완료되면 이메일을받을 수있는 방법이 있습니까? 이를 수행하는 Linux 프로그램이있을 수 있습니까? 그러면 터미널에 언제 로그인하고 다음 시뮬레이션을 준비해야하는지 알 수 있습니다.

우분투 리눅스를 사용하고 있습니다. 시간 내 줘서 고마워.


3
그것은 제목에서 이미 다루었던 간단한 질문에 대한 다소 길고 관련이없는 설명이었습니다. 당신은 항상 이것을합니까?
Acumenus

5
@ABB 과학자로서 나는 "길고 관계없는"설명에 유용한 정보가 있다고 생각합니다. 예를 들어, 우리는 수동 터미널 작업이 필요하다는 것을 알고 질문을하는 이유가 있습니다. 또한 우리는 OP가 무엇을하고 있는지에 대해 약간의 생각을 가지고 있기 때문에 우리는 완전히 암흑에 대해 생각하지 않으므로 질문에 요청되지 않지만 사용 또는 관심이있을 수있는 추가 정보를 제공 할 수 있습니다.
user3728501

답변:


30

at데몬에 제출 된 작업 은 완료시 stderr 및 stdout에서 출력을 보냅니다. 작업에 출력이없는 경우에도 메일을 보내도록 구성 할 수도 있습니다. 또한 제어 터미널 없이도 실행할 수 있다는 이점이 있으므로 터미널을 닫으면 작업에 미치는 영향에 대해 걱정할 필요가 없습니다.

예:

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

이 작업이 완료되면 작업을 제출 한 사용자에게 이메일이 발송되고 출력이 있으면 이메일을 받게됩니다. LOGNAME환경 변수를 변경하여 이메일 수신자를 변경할 수 있습니다 .

at시스템이 사용 중이 아닐 때 실행할 작업을 큐에 대기 할 수있는 배치 모드가 있습니다. 여러 사용자가 리소스를 놓고 경쟁 할 때는이 큐잉 시스템이 좋지 않지만 그럼에도 불구하고 작업을 실행하려면 다음을 수행하십시오.

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

기본적으로 시스템로드가 1.5 미만인 경우가 아니라면 작업이 시작되지 않지만 해당로드 수치를 조정할 수 있습니다 (24 개의 코어를 사용해야합니다). 로드 제한을로드 제한 (1.5 기본값) 이상으로 부딪치지 않으면 병렬로 실행할 수 있거나 1.5 이상으로 개별적으로로드를 부딪 치면 직렬로 실행됩니다.

로 작업 대기열을보고 다음으로 작업을 atq삭제할 수 있습니다.atrm

답변 종속성 :

  1. atd데몬 실행 ( ps -ef|grep atd)
  2. 작업을 제출할 수 있습니다 atd( /etc/at.deny/ /etc/at.allow구성에 의해 거부되지 않음 )
  3. 기능성 sendmailMTA

대부분의 시스템에는 이러한 요구 사항에 문제가 없지만 확인해야합니다.


49

예, 있습니다

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

-s "text"가 제목 인 경우, echo는 사용자에게 보낼 텍스트를 메일에 제공합니다.


4
mail명령에는 로컬 MTA가 올바르게 구성되어 있어야합니다. 이것은 쉽고 간단한 솔루션입니다.
jordanm

6
다음 mail명령의 출력을 보내는데 도 사용할 수 있습니다 .{ command; echo Done; } | mail -s "subject" recipient@example.com
glenn jackman

4
@Andrew 원래 명령을 실행 한 터미널 / 쉘이 작동하려면 열려 있어야합니다. screen또는 과 같은 것을 사용하면 어렵지 tmux않지만 터미널을 며칠 / 몇 주 동안 열지 않는 것이 좋습니다. 와 솔루션 at작업 관리는 또한 문제 돌볼 것입니다.
Caleb

@Caleb Cant &명령의 끝에 a를 추가 하여 뒤에서 실행되도록하십시오. sleep 30 && echo "Process done" | mail -s "Process done" mail@domain.tld &
Theo Kouzelis

@ 테오 아니 당신은 할 수 없습니다. 백그라운드에서도 프로세스는 여전히 셸의 자식이며 셸이 죽으면 자식 프로세스는 종료 신호를받습니다. 당신은 할 수 사용 nohup연결을 해제합니다,하지만 당신은 쉘에서 제어를 계속 할 수있는 능력을 잃게됩니다. 이것은 부분적으로 tmux입니다. 실행중인 프로세스를 활발하게 연결되고 확인 된 터미널 세션과 분리하면서도 정상적으로 프로세스와 상호 작용할 수 있습니다.
Caleb

7

전자 메일을 보내도록 Python 스크립트를 설정하는 것이 좋습니다. 사용하는 서비스에 따라 올바른 메일 서버를 작성하고 구성하기가 매우 쉽습니다. 그들은 다음과 같이 보입니다 :

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

다른 답변에서 제안 된 파이프 연산자와 함께 이것을 사용하십시오.

이 문제에 대해 찾은 또 다른 훌륭한 솔루션은 Pushover를 사용하는 것 입니다. 푸시 오버- "푸시 오버를 사용하면 Android 및 iOS 장치로 실시간 알림을 쉽게 보낼 수 있습니다." 빌드가 완료되면 휴대 전화로 메시지를 보내도록 쉬운 API를 만들 수있는 간단한 스크립트를 설정했습니다.

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

6

trap프로세스 종료시 또는 프로세스의 중단, 중단 또는 종료시 메일을 보내기 위해 명령을 사용할 수도 있습니다 . 스크립트 상단에 배치해야하는 코드는 다음과 같습니다.

    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

아룬


5

process_watcher.py를 썼습니다

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

현재 이메일 본문은 다음과 같습니다.

PID 18851 : /usr/lib/libreoffice/program/soffice.bin --writer --splash-pipe = 5
시작 : 3 월 10 일 목요일 18:33:37 종료 : 3 월 10 일 목요일 18:34:26 (지속 시간 0 : 00 : 49)
메모리 (현재 / 피크)-상주 : 155,280 / 155,304 kB 가상 : 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

개선이 필요한 경우 GitHub 문제를 해결하십시오.


2
PID로 이미 실행중인 프로세스에 연결할 수 있기 때문에 나에게 당첨되었습니다.
joseph_morris

1
@joseph_morris이 스크립트도 좋아합니다. 그러나 완전성을 위해 명령을 실행하여이 도우미없이 실행중인 (Ctrl-Z를 통해 일시 중단됨) 프로세스에 쉽게 연결할 수 있습니다 fg ‹PID›; mail -s Completed to@example.com <<< 'Message here'.
Konrad Rudolph


1

프로그램이 이미 실행 중이라고 가정하면 bash + pgrep을 사용하여 시청하십시오.

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

비슷한 것을 사용했습니다 : while [[$ (pgrep myprog)]]; 잠을 자십시오 60; 끝난; 에코 "myprog가 완료되었습니다"| mail -s "process done"mail@example.com
marlar

0

오래 전에이 별칭을 만들었습니다 (csh에서는 tcsh에서 사용합니다).

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

그것은이 필요한 Mail시스템에 설치되어 작동하지만, 명령 줄에서 (등, 별칭을 포함한 확장 물결표)하는 것처럼 명령이 바로 실행되는 장점이있다 - 당신이 사용하여 작업을 실행할 때 at또는 cron그것은 기본에서 실행 스크립트가 실패하거나 비정상적인 출력을 제공하기에 충분히 다른 환경 ( cron여러 번 부터 물었 습니다)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.