Есть ли способ слушать процесс?

9

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

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

Nir
источник

Ответы:

3

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

someprocess
echo $?

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

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

someprocess &
otherwork
wait %+
echo $?

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

Если вам действительно нужен PID, вы также можете сделать это следующим образом:

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

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

lesmana
источник
А как waitработает? Сколько процессора он обычно берет из системы?
Nir
1
Я не знаю, как именно waitработает Bash . Я знаю, что это не занимает заметное количество системных ресурсов. Вы можете просмотреть исходный код здесь: git.savannah.gnu.org/cgit/bash.git/tree/builtins/wait.def
lesmana
6

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

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

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

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

Ансгар Эстерманн
источник
4
  1. Цепочка выполнения «уведомить»

    $ process; notify $? &

    Обратите внимание, что если процесс завершится неожиданным образом, notifyон не будет выполнен

  2. Настройка ловушек

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

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

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

$ process; notify-send "process finished with status $?" &
Мирослав Кошкар
источник
2

если ваш процесс запущен как deamon, рассмотрите возможность использования upstart или monit, они являются стандартными способами:

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

http://mmonit.com/monit/

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

damphat
источник
1

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

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

Alex
источник