Thông báo khi quá trình chạy kết thúc


21

Có một vài câu hỏi và câu trả lời ở đây liên quan đến việc được cảnh báo khi một quá trình hoàn thành / thoát ( 1 , 2 ) - nhưng tất cả đều cho rằng người dùng đã tự đưa ra quy trình nói trên và do đó có thể tạo kịch bản với cảnh báo được tích hợp vào kịch bản điều hành, hoặc đưa quá trình đến một loại cảnh báo nào đó.

Tình huống của tôi là tôi muốn được cảnh báo về việc hoàn thành / thoát một quá trình mà người dùng của tôi không khởi tạo. Cụ thể, tôi đang xử lý hàng loạt các tệp video lớn trên máy chủ Ubuntu 12.04 LTS. Một số thao tác trên các tệp này mất nhiều thời gian, vì vậy tôi muốn một số loại cảnh báo (email sẽ rất tuyệt) khi một kết thúc cụ thể kết thúc. Họ mất rất nhiều thời gian để thực hiện việc này trên cơ sở một lần, theo cách thủ công, dựa trên thuế TNCN sẽ hoàn toàn ổn.

Để cung cấp thêm thông tin - giả sử tôi đang xử lý một tệp đặc biệt lớn và tôi thấy rằng nó đã được chuyển sang tập lệnh FFMPEG, bản thân quy trình là tập lệnh python (khá phức tạp và không phải do tôi tự viết và một cái gì đó Tôi không muốn sửa đổi - mặc dù đó sẽ là cách tiếp cận logic đầu tiên). Tôi tưởng tượng việc ban hành một lệnh hoặc tập lệnh với bộ mã lệnh python đang chạy như là một đối số và khi quá trình với bộ mã đó không còn chạy nữa, tập lệnh cảnh báo sẽ thực hiện.

Có ý kiến ​​gì không?


monit ( mmonit.com/monit/documentation ) có vẻ như là một lựa chọn tiềm năng, nhưng phức tạp hơn nhiều so với những gì tôi cần - hy vọng có thể có một cách đơn giản hơn, trực tiếp hơn và ít phình to hơn chỉ làm những gì tôi đang hỏi, và không còn nữa .
dongle

Câu trả lời:


9

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 18h33 : 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.


23

Một cái gì đó như thế này?

(while kill -0 $pid; do sleep 1; done) && echo "finished"

Thay thế $pidbằng id quy trình và echo "finished"bằng bất cứ điều gì bạn muốn làm khi quá trình thoát.

Ví dụ:

(while kill -0 $pid; do sleep 1; done) && mail ...

Hiện tượng! Hoạt động như một lá bùa.
dongle

1
Lưu ý nhỏ (và có thể rõ ràng) - khi nói quy trình không thuộc sở hữu của người dùng, phải sudo giết.
khóa

1
@dongle, ít nhất là trên hộp RHEL của tôi, kill -0báo cáo No such processvề các pids không tồn tại và Operation not permittedcho các pids thuộc sở hữu của một người dùng khác vì vậy có lẽ việc giải thích thông báo lỗi sẽ làm giảm nhu cầu vềsudo
iruvar

1
Nếu bạn đang lặp lại, bạn luôn có thể echo -en "\007 \007 \007", điều này sẽ phát ra một 'chuông' thiết bị đầu cuối. Việc điều đó có chuyển thành âm thanh nghe được hay không phụ thuộc vào thiết bị đầu cuối và phần cứng của bạn (nhưng thường là như vậy).
Morgon

5

Tôi sử dụng &&để thực hiện lệnh thứ hai khi lệnh đầu tiên kết thúc thành công. Dưới đây là một số ví dụ:

  1. Xóa một thư mục lớn và tiếng bíp:

    rm -rv ~/tmp && beep
  2. Biên dịch kernel và gửi email:

    make && mail -s "Compilation is done" user@yourmaildomain.com

Đây có phải là một cách tốt để giải quyết vấn đề của bạn? Trong trường hợp khác, bạn có thể thêm ||lệnh và lệnh thứ ba trong trường hợp thất bại.

Ngoài ra, một tập lệnh shell có thể nhận trạng thái thoát ( $?) của lệnh của bạn và với if/elsevà các vòng lặp bạn có thể làm bất cứ điều gì bạn muốn.


Cảm ơn Willian, nhưng như tôi đã nói, thách thức đặc biệt trong trường hợp sử dụng của tôi là đây không phải là lệnh mà tôi đang ban hành, mà là một quy trình đã chạy. Do đó && không phải là một lựa chọn. Dù sao cũng cảm ơn bạn.
dongle

4

Nếu bạn không có pid, điều này sẽ chạy cho đến khi tất cả các phiên bản của ffmpeg kết thúc:

(while pidof ffmpeg | grep -q "[0-9]?"; do sleep 1; done) && echo "finished"

0

Nếu bạn không muốn sử dụng tùy chọn bỏ phiếu hoặc tập lệnh bên ngoài và bạn đã bắt đầu quá trình chạy dài, bạn có thể tạm dừng nó bằng CTRL + Z (gửi tín hiệu SIGTSTP) và sau đó tiếp tục với fg(chuyển quá trình sang tiền cảnh).

Ví dụ:

my_command  # long running command
# press CTRL+Z to pause
fg ; notify-send 'finished'

Ngoại trừ ... "Tình huống của tôi là tôi muốn được cảnh báo về việc hoàn thành / thoát một quy trình mà người dùng của tôi không khởi tạo."
Jeff Schaller

-1

Tôi đã tạo một ứng dụng sẽ gửi thông báo tới điện thoại Android của bạn khi quá trình kết thúc để bạn không bị ràng buộc với máy tính của mình.

Cài đặt, sau đó thêm ;notifier.shvào cuối lệnh của bạn.

Ví dụ: nếu lệnh của bạn là make install, bạn sẽ thực hiện lệnh của mình:

make install; notifier.sh

https://notifier.sh

https://play.google.com/store/apps/details?id=sh.notifier


Tuy nhiên, tất cả đều cho rằng người dùng đã tự đưa ra quy trình nói trên và do đó có thể tạo kịch bản cho nó bằng một cảnh báo được tích hợp trong tập lệnh quản lý hoặc chuyển quá trình sang một loại cảnh báo nào đó. / Tình huống của tôi là tôi muốn được cảnh báo về việc hoàn thành / thoát một quy trình mà người dùng của tôi không khởi tạo. Cá
G-Man nói 'Tái lập lại'
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.