Баш делает это для тебя. Он уведомит вас о завершении процесса, вернув вам контроль, и сохранит статус выхода в специальной переменной $?
. Это выглядит примерно так:
someprocess
echo $?
Смотрите руководство по bash о специальных параметрах для получения дополнительной информации.
Но я полагаю, что вы хотите сделать другую работу во время ожидания. В bash вы можете сделать это следующим образом:
someprocess &
otherwork
wait %+
echo $?
someprocess &
запустит процесс в фоновом режиме. Это означает, что контроль вернется немедленно, и вы сможете выполнять другую работу. Процесс, запущенный в фоновом режиме, называется заданием в bash. wait
будет ждать завершения данного задания, а затем вернет статус завершения этого задания. На рабочие места ссылаются %n
. %+
относится к последней запущенной работе. Смотрите руководство bash о контроле за работой для получения дополнительной информации.
Если вам действительно нужен PID, вы также можете сделать это следующим образом:
someprocess &
PID=$!
otherwork
wait $PID
echo $?
$!
специальная переменная, содержащая PID последнего запущенного фонового процесса.
wait
работает? Сколько процессора он обычно берет из системы?wait
работает Bash . Я знаю, что это не занимает заметное количество системных ресурсов. Вы можете просмотреть исходный код здесь: git.savannah.gnu.org/cgit/bash.git/tree/builtins/wait.defОдин из них - по общему признанию, неуклюжий - заключается в использовании
strace
:будет наблюдать за процессом с PID 12345, не перехватывая ни системный вызов (первый
-e
), ни сигналы (второй-e
). Как только процесс завершится обычным способом, значение выхода будет напечатано.Если процесс завершается сигналом, strace завершает работу тихо (при запуске с параметрами, указанными выше). Вы можете использовать, например,
-e signal=kill
чтобы изменить это поведение. Тем не менее, обратите внимание, что-e signal=all
(или, что то же самое, пропуск этой-e signal
опции) может привести к большому объему вывода, если сигналы принимаются и обрабатываются программой.источник
Цепочка выполнения «уведомить»
Обратите внимание, что если процесс завершится неожиданным образом,
notify
он не будет выполненНастройка ловушек
Процесс сигнализируется сигналами другого значения и может реагировать соответствующим образом
Вам не ясно, какое уведомление вы имеете в виду. По сути, это может быть что угодно, что, конечно, звучит как «колокол». Один для многих, например.
notify-send
изlibnotify
библиотеки.источник
если ваш процесс запущен как deamon, рассмотрите возможность использования upstart или monit, они являются стандартными способами:
http://www.alexreisner.com/code/upstart
http://mmonit.com/monit/
Они могут отслеживать процессы, код завершения, перезапускать процессы, записывать журнал, ...
источник
С
ptrace()
его помощью вы можете прикрепить трассировщик к процессу (или запустить новый), установить хук сPTRACE_O_TRACEEXIT
(linux> = 2.5.60) и поспать до выхода из процесса, а затемPTRACE_GETEVENTMSG
получить статус выхода.Вот пример реализации, называемый стопором , я проверил его только с помощью
attach
опции, и для ее работы потребовалось несколько изменений (в конце концов, если потребуется, я выложу код где-нибудь).источник