Có chương trình nào có thể gửi cho tôi e-mail thông báo khi quá trình kết thúc không?


46

Tôi là một nhà khoa học tính toán và tôi chạy rất nhiều phép tính dài trên Linux. Cụ thể, tôi chạy mô phỏng động lực phân tử (MD) bằng gói GROMACS. Các mô phỏng này có thể mất vài ngày hoặc vài tuần, chạy trên (ví dụ) 8 đến 24 lõi. Tôi có quyền truy cập vào một số nút của một cụm, điều đó có nghĩa là tại bất kỳ thời điểm nào, tôi đang chạy khoảng 4 hoặc 5 công việc (mỗi công việc trên một nút khác nhau và mỗi công việc trên 8-24 lõi).

Vấn đề là mô phỏng mất một lượng thời gian khác nhau. Tôi muốn giữ tất cả các nút làm việc trên các mô phỏng xung quanh đồng hồ, nhưng để bắt đầu một mô phỏng mới, tôi cần phải đăng nhập bằng một thiết bị đầu cuối và thực hiện một số công việc thủ công. Nhưng tôi luôn quên mất bao nhiêu thời gian còn lại trong một mô phỏng, vì vậy tôi luôn luôn kiểm tra chúng liên tục.

Có cách nào để tôi có thể nhận e-mail khi quá trình Linux kết thúc không? Có thể có một chương trình Linux làm điều này? Bằng cách đó tôi sẽ biết khi nào nên đăng nhập bằng thiết bị đầu cuối và chuẩn bị mô phỏng tiếp theo.

Tôi đang sử dụng Ubuntu Linux. Cảm ơn vì đã dành thời gian cho tôi.


3
Đó là một mô tả khá dài và không liên quan cho một câu hỏi đơn giản đã được đề cập trong tiêu đề. Bạn luôn luôn làm điều này?
Acumenus

5
@ABB Là một nhà khoa học, tôi cho rằng có những thông tin hữu ích trong phần mô tả "dài và không liên quan". Ví dụ, chúng tôi biết rằng công việc đầu cuối thủ công là bắt buộc và do đó có một lý do để đặt câu hỏi. Ngoài ra, chúng tôi có một số ý tưởng về những gì OP đang làm để chúng tôi không suy nghĩ hoàn toàn trong bóng tối và do đó có thể cung cấp thông tin bổ sung không được yêu cầu trong câu hỏi nhưng có thể được sử dụng hoặc quan tâm.
dùng3728501

Câu trả lời:


30

Các công việc được gửi tới atdaemon sẽ gửi bất kỳ đầu ra nào cho bạn từ thiết bị xuất chuẩn và thiết bị xuất chuẩn sau khi hoàn thành. Nó cũng có thể được cấu hình để gửi thư ngay cả khi công việc không có đầu ra. Nó cũng có lợi ích khi chạy mà không có thiết bị đầu cuối kiểm soát, vì vậy bạn không phải lo lắng về ảnh hưởng của việc đóng thiết bị đầu cuối của bạn trong công việc.

thí dụ:

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

Khi công việc này hoàn thành, người dùng đã gửi công việc sẽ nhận được email và nếu có bất kỳ đầu ra nào bạn sẽ nhận được nó. Bạn có thể thay đổi người nhận email bằng cách thay đổi LOGNAMEbiến môi trường.

atcó chế độ hàng loạt nơi bạn có thể xếp hàng các công việc để chạy khi hệ thống không bận. Đây không phải là một hệ thống xếp hàng rất tốt khi nhiều người dùng đang cạnh tranh tài nguyên, nhưng dù sao, nếu bạn muốn chạy công việc với nó:

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

Theo mặc định, các công việc sẽ không bắt đầu trừ khi tải hệ thống dưới 1,5, nhưng con số tải đó có thể được điều chỉnh (và với 24 lõi tôi nói bạn nên làm). Chúng có thể chạy song song nếu chúng không va chạm loadavg vượt quá giới hạn tải (1,5 lần nữa mặc định) hoặc nếu chúng va chạm loadavg trên 1,5, chúng sẽ chạy nối tiếp.

Bạn có thể xem hàng đợi công việc với atqvà xóa công việc vớiatrm

Trả lời phụ thuộc:

  1. Chạy atddaemon ( ps -ef|grep atd)
  2. Bạn được phép gửi công việc tới atd(không bị từ chối bởi /etc/at.deny/ /etc/at.allowcấu hình)
  3. Chức năng sendmailMTA

Hầu hết các hệ thống không có vấn đề với các yêu cầu này, nhưng đáng để kiểm tra.


49

Vâng, có

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

Trong đó "văn bản" là chủ đề, tiếng vang sẽ gửi thư một số Văn bản để gửi cho bạn.


4
Các maillệnh không đòi hỏi sự MTA địa phương để được cấu hình đúng. Đây là giải pháp dễ dàng và đơn giản.
jordanm

6
bạn cũng có thể sử dụng mailđể gửi cho bạn đầu ra của lệnh:{ command; echo Done; } | mail -s "subject" recipient@example.com
glenn jackman

4
@Andrew Hãy lưu ý rằng để làm việc này, thiết bị đầu cuối / shell bạn đã chạy lệnh gốc phải ở trạng thái mở. Điều này có thể không khó nếu bạn sử dụng một cái gì đó như screenhoặc tmux, nhưng có thể rất cảm động khi có một thiết bị đầu cuối mở ở đâu đó trong nhiều ngày / tuần mà không có nó. Các giải pháp với atviệc quản lý công việc cũng sẽ chăm sóc của vấn đề đó.
Caleb

@Caleb Không thể thêm bạn &vào cuối lệnh để khiến nó chạy ở mặt sau. sleep 30 && echo "Process done" | mail -s "Process done" mail@domain.tld &
Theo Kouzelis

@Theo không bạn không thể. Ngay cả trong nền, quá trình vẫn là con của vỏ của bạn và nếu vỏ chết, tiến trình con sẽ nhận được tín hiệu tiêu diệt. Bạn có thể sử dụng nohupđể hủy liên kết chúng, nhưng bạn cũng mất khả năng tiếp tục kiểm soát nó từ vỏ. Đây là một phần những gì tmuxlà cho. Nó tách các quy trình đang chạy khỏi phiên cuối được kết nối và xem tích cực của bạn trong khi vẫn cho phép bạn tương tác với chúng bình thường.
Caleb

7

Tôi khuyên bạn nên thiết lập một tập lệnh python để gửi email, chúng rất dễ viết và cấu hình các máy chủ gửi thư chính xác cho bất kỳ dịch vụ nào bạn sử dụng. Họ trông giống như thế này:

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

Sử dụng kết hợp với toán tử đường ống được đề xuất trong các câu trả lời khác.

Một giải pháp tuyệt vời khác mà tôi đã tìm thấy cho vấn đề này là sử dụng Pushover . Pushover - "Pushover giúp dễ dàng gửi thông báo theo thời gian thực tới các thiết bị Android và iOS của bạn." Tôi thiết lập một tập lệnh đơn giản giúp tối ưu hóa API dễ dàng để gửi tin nhắn đến điện thoại của tôi khi quá trình xây dựng của tôi hoàn tất.

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

6

Bạn cũng có thể sử dụng traplệnh để gửi thư khi thoát khỏi quá trình hoặc khi bị gián đoạn, treo máy hoặc khi kết thúc quá trình. Đây là mã mà bạn phải đặt ở đầu tập lệnh của mình.

    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

Tôi đã viết process_watcher.py

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

Hiện tại, cơ thể email trông giống như:

PID 18851: /usr/lib/libreoffice/program/soffice.bin --writer --Station-pipe = 5
Bắt đầu: Thu, 10 tháng 10 lúc 18 giờ 33 phút: Đã kết thúc: Thu, 10 tháng 10 lúc 18 giờ 34 phút : 00: 49)
Bộ nhớ (hiện tại / cao điểm) - Thường trú: 155.280 / 155.304 kB Ảo: 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

Giải quyết vấn đề GitHub nếu bạn cần bất kỳ cải tiến nào.


2
Người chiến thắng cho tôi vì có thể đính kèm bằng PID vào một quy trình đã chạy.
joseph_morris

1
@joseph_morris Tôi cũng thích tập lệnh này - nhưng để hoàn chỉnh, bạn có thể dễ dàng đính kèm vào quy trình đang chạy (bị treo, qua Ctrl-Z) mà không cần trình trợ giúp này bằng cách ban hành lệnh fg ‹PID›; mail -s Completed to@example.com <<< 'Message here'.
Konrad Rudolph

1

Tôi có một kịch bản trồng tại nhà phù hợp với tôi. Sử dụng:

mail-after <your command>

Nó sẽ gửi một e-mail với thông tin có ý nghĩa trong chủ đề và với đầu ra của quá trình trong cơ thể.

Hướng dẫn cài đặt nằm trên trang chính của repo GitHub - hiện tại cho tất cả các tập lệnh, một liên kết tượng trưng được tạo ~/bin.


1

Giả sử chương trình của bạn đã chạy, hãy sử dụng bash + pgrep để xem nó.

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

Tôi đã sử dụng một cái gì đó tương tự: while [[$ (pgrep myprog)]]; ngủ 60; làm xong; tiếng vang "myprog đã xong" | mail -s "quá trình thực hiện" mail@example.com
khai báo

0

Trước đây, tôi đã tạo bí danh này (trong csh, bây giờ tôi sử dụng nó trong tcsh):

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

Nó yêu cầu phải Mailđược cài đặt và làm việc trên hệ thống của bạn, nhưng có lợi thế là lệnh của bạn chạy chính xác như từ dòng lệnh (bao gồm bí danh, mở rộng dấu ngã, v.v.) - khi bạn chạy một công việc bằng cách sử dụng athoặc cronnó chạy theo mặc định môi trường có thể đủ khác nhau để khiến tập lệnh của bạn bị lỗi hoặc cung cấp đầu ra bất thường (tôi đã bị cắn bởi điều đó từ cronnhiều lần)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.