Оповещение о завершении процесса

21

Здесь есть несколько вопросов и ответов, касающихся оповещения о завершении / выходе процесса ( 1 , 2 ), но все они предполагают, что пользователь сам выполнил указанный процесс, и, таким образом, могут написать его с помощью встроенного в управляющий сценарий или направить процесс к какому-либо предупреждению.

Моя ситуация такова, что я хотел бы получить уведомление о завершении / завершении процесса, который мой пользователь не инициализирует. А именно, я массово обрабатываю массивные видеофайлы на сервере Ubuntu 12.04 LTS. Определенные операции с этими файлами занимают очень много времени, поэтому я хотел бы получить какое-то предупреждение (электронная почта была бы хороша), когда конкретный завершается. Они занимают так много времени, что делать это одноразово, вручную, на основе PIT, было бы прекрасно.

Чтобы предоставить больше информации - скажем, я обрабатываю особенно большой файл, и я вижу, что он перешел к сценарию FFMPEG, сам процесс является сценарием Python (который довольно сложен, не написан мной и что-то в этом роде) Я не хочу изменять - хотя это был бы первый логический подход). Я представляю команду или сценарий с PID указанного запущенного сценария python в качестве аргумента, и когда процесс с этим PID больше не выполняется, сценарий оповещения делает свое дело.

Любые идеи?

донгл
источник
monit ( mmonit.com/monit/documentation ) кажется потенциальным вариантом, но гораздо более сложным, чем то, что мне нужно - надеясь, что может быть более простой, более прямой и менее раздутый способ делать только то, что я прошу, и не более ,
ключ

Ответы:

9

Я написал process_watcher.py

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

В настоящее время тело письма выглядит так:

PID 18851: /usr/lib/libreoffice/program/soffice.bin --writer --splash-pipe = 5
Начало работы: чт, 10 марта 18:33:37 Завершено: чт, 10 марта 18:34:26 (продолжительность 0 : 00: 49)
Память (текущая / максимальная) - Резидент: 155 280/155 304 КБ Виртуальный: 1 166 968/1 188 216 КБ

[+] 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, если вам нужны какие-либо улучшения.

Арло
источник
23

Что-то вроде этого?

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

Замените $pidна идентификатор процесса и echo "finished"все, что вы хотите сделать при выходе из процесса.

Например:

(while kill -0 $pid; do sleep 1; done) && mail ...
хаос
источник
Феноменально! Работает как шарм.
донгл
1
Незначительное (и, вероятно, очевидное) замечание - когда указанный процесс не принадлежит пользователю, он должен выполнить уничтожение.
ключ
1
@dongle, по крайней мере на моем ящике RHEL, kill -0сообщает No such processо несуществующих pids и Operation not permittedpids, принадлежащих другому пользователю, поэтому, возможно, интерпретация сообщения об ошибке должна устранить необходимостьsudo
iruvar
1
Если вы повторяете, вы всегда можете echo -en "\007 \007 \007", который выдаст терминал «колокол». Преобразуется ли это в реальный слышимый звук, зависит от вашего терминала и аппаратного обеспечения (но обычно так и есть).
Моргон
5

Я использую &&для выполнения второй команды, когда первая успешно завершена. Вот несколько примеров:

  1. Удалить большую папку и подать звуковой сигнал:

    rm -rv ~/tmp && beep
  2. Скомпилируйте ядро ​​и отправьте электронное письмо:

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

Это хороший способ решить вашу проблему? В другом случае вы можете добавить ||и третью команду в случае сбоя.

Кроме того, сценарий оболочки может получить статус выхода ( $?) вашей команды, а с помощью if/elseциклов и вы можете делать все, что захотите.

Виллиан Пайшао
источник
Спасибо Виллиану, но, как я уже сказал, особая проблема в моем сценарии использования заключается в том, что это не команда, которую я выполняю, а уже запущенный процесс. Таким образом, && не вариант. Спасибо, в любом случае.
ключ
4

Если у вас нет pid, он будет работать до тех пор, пока все экземпляры ffmpeg не будут завершены:

(while pidof ffmpeg | grep -q "[0-9]?"; do sleep 1; done) && echo "finished"
user82927
источник
0

Если вы не хотите использовать опцию опроса или внешний сценарий, и вы уже запустили длительный процесс, вы можете приостановить его с помощью CTRL + Z (отправляет сигнал SIGTSTP), а затем возобновить его с fg(перемещает процесс в на переднем плане).

Например:

my_command  # long running command
# press CTRL+Z to pause
fg ; notify-send 'finished'
Вениамин
источник
За исключением ... «Моя ситуация такова, что я хотел бы получить уведомление о завершении / завершении процесса, который мой пользователь не инициализирует».
Джефф Шаллер
-1

Я сделал приложение, которое отправит уведомление на ваш телефон Android, когда процесс завершится, чтобы вам не пришлось привязываться к компьютеру.

Установите, затем добавьте ;notifier.shв конец вашей команды.

Например, если ваша команда была make install, вы бы сделали свою команду:

make install; notifier.sh

https://notifier.sh

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

Jolt151
источник
«… Но все они предполагают, что пользователь сам выполнил указанный процесс, и, таким образом, могут написать его с помощью предупреждения, встроенного в управляющий сценарий, или направить процесс к некоторому виду предупреждения. / Моя ситуация такова, что я хотел бы получить уведомление о завершении / завершении процесса, который мой пользователь не инициализирует ».
G-Man говорит:« Восстановите Монику »