Существует ли способ послушать процесс?

Я хочу знать, существует ли способ слушать процесс в Linux и Unix - когда он заканчивается и каков код выхода процесса (сценарий).

Я не хочу писать сценарий, который будет работать X секунды и проверяют ps -ef | grep PID если процесс все еще жив. Я хочу знать, существует ли способ, которым процесс уведомит меня, когда он закончился и каков был его код выхода.

8
09.09.2016, 14:19
5 ответов

Bash делает это для Вас. Это уведомит Вас, когда концы процесса путем предоставления Вам назад будут управлять, и это сохранит статус выхода в специальной переменной $?. Это примерно походит на это:

someprocess
echo $?

См. руководство удара о специальных параметрах для получения дополнительной информации.

Но я предполагаю, что Вы хотите сделать другую работу при ожидании. В ударе можно сделать это как это:

someprocess &
otherwork
wait %+
echo $?

someprocess & запустит процесс в фоновом режиме. Это означает, что управление сразу возвратится, и можно сделать другую работу. Процесс, запущенный в фоновом режиме, называют заданием в ударе. wait будет ожидать данного задания, чтобы закончить и затем возвратить статус выхода того задания. Заданиями ссылаются %n. %+ относится к последнему запущенному заданию. См. руководство удара об управлении заданиями для получения дополнительной информации.

При реальной необходимости в PID, можно также сделать это как это:

someprocess &
PID=$!
otherwork
wait $PID
echo $?

$! специальная переменная, содержащая PID последнего запущенного фонового процесса.

3
27.01.2020, 20:10
  • 1
    И как делает wait работы? Сколько ЦП будет обычно требоваться от системы? –  Nir 15.08.2013, 22:31
  • 2
    , который я не знаю, как точно колотят wait работы. Я знаю, что это не берет значимое количество системных ресурсов. Можно рассмотреть исходный код здесь: git.savannah.gnu.org/cgit/bash.git/tree/builtins/wait.def –  lesmana 15.08.2013, 23:03

Один - по общему признанию властный - подход должен использовать strace:

$ strace -e trace=none -e signal=none -p 12345

будет следить за процессом с PID 12345, не прерывая системного вызова (сначала -e) и никакие сигналы (второй -e). После того как процесс выходит регулярным способом, значение выхода будет распечатано.

Если процесс завершается сигналом, strace выходы тихо (когда выполнено с опциями, данными выше). Можно использовать, например. -e signal=kill изменить это поведение. Отметьте, однако, это -e signal=all (или, эквивалентно, опуская -e signal опция), мог бы произвести большую сумму вывода, если сигналы получены и обработаны программой.

6
27.01.2020, 20:10
  1. Объединение в цепочку выполнения "уведомляет"

    $ process; notify $? &
    

    Заметьте это, если процесс выйдет неожиданным способом notify не будет выполняться

  2. Установка прерываний

    Процесс сообщен сигналами другого значения и может реагировать соответственно

    #!/bin/bash
    
    process
    
    function finish {
        notify $?
    }
    trap finish EXIT
    

Вы не ясны, какое уведомление Вы имеете в виду. В сущности это может быть что-либо, что звонит в "звонок", конечно. Один для многих, например. notify-send от libnotify библиотека.

$ process; notify-send "process finished with status $?" &
4
27.01.2020, 20:10

если Ваш процесс, выполненный как deamon, рассмотрите использование выскочки или monit, они - вид стандартных путей:

http://www.alexreisner.com/code/upstart

http://mmonit.com/monit/

Они могут контролировать процесс, код выхода, процессы перезапуска, записать журнал...

2
27.01.2020, 20:10

С ptrace() можно присоединить трассировщик к процессу (или выполнить новый), установите рычаг с PTRACE_O_TRACEEXIT (Linux> = 2.5.60) и сон до выхода процесса, затем с PTRACE_GETEVENTMSG получите статус выхода.

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

0
27.01.2020, 20:10

Теги

Похожие вопросы