Сповіщення, коли процес запуску закінчується


21

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

Моя ситуація полягає в тому, що я хотів би отримувати сповіщення про завершення / вихід процесу, який мій користувач не ініціалізує. А саме я масово обробляю масивні відеофайли на сервері Ubuntu 12.04 LTS. Деякі операції над цими файлами займають дуже багато часу, тому я хотів би отримати якесь попередження (електронний лист буде чудовим), коли конкретний завершиться. Вони займають так довго, що робити це одноразово, вручну, на основі ПДФО, було б чудово.

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

Будь-які ідеї?


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

Відповіді:


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 ...

Феноменальна! Працює як шарм.
dongle

1
Незначна (і, очевидно, очевидна) примітка - коли зазначений процес не належить користувачеві, він повинен надіслати вбивство.
dongle

1
@dongle, щонайменше, у моєму вікні RHEL, kill -0повідомляє No such processпро неіснуючі підписи та Operation not permittedпро підписи, які належать іншому користувачеві, тому, можливо, інтерпретація повідомлення про помилку повинна усунути необхідність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і циклів ви можете робити все, що завгодно.


Дякую Вілліану, але, як я вже сказав, особливим завданням у моєму випадку є те, що це не команда, яку я видаю, а вже запущений процес. Таким чином, && - це не варіант. Все одно, дякую.
dongle

4

Якщо у вас немає pid, це буде працювати, поки всі екземпляри ffmpeg не будуть закінчені:

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

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


"... але всі вони припускають, що користувач випустив згаданий процес самостійно, і, таким чином, може скриптувати його за допомогою попередження, вбудованого в керуючий сценарій, або передавати процес на якесь попередження. / Моя ситуація полягає в тому, що я хотів би отримувати сповіщення про завершення / вихід із процесу, який мій користувач не ініціалізує. "
G-Man каже" Відновити Моніку "
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.