2012-03-27 3 views
6

Есть ли способ подождать, пока процесс завершится, если я не тот, кто его запустил?Ждите произвольного процесса и получите его код выхода в Linux

например. если я запустил «ps -ef» и выбрал любой PID (при условии, что у меня есть права на доступ к информации о процессе) - есть ли способ, которым я могу дождаться завершения PID и получить его код выхода?

ответ

0

Если вы знаете идентификатор процесса вы можете использовать wait команды, которая является Баш: встроенный

wait PID 

Вы можете получить PID последнего вывода команды в Баш с помощью $!. Или, вы можете grep для этого с выхода ps.

На самом деле команда wait - это полезный способ запуска команды parralel в bash. Вот пример:

# Start the processes in parallel... 
./script1.sh 1>/dev/null 2>&1 & 
pid1=$! 
./script2.sh 1>/dev/null 2>&1 & 
pid2=$! 
./script3.sh 1>/dev/null 2>&1 & 
pid3=$! 
./script4.sh 1>/dev/null 2>&1 & 
pid4=$! 

# Wait for processes to finish... 
echo -ne "Commands sent... " 
wait $pid1 
err1=$? 
wait $pid2 
err2=$? 
wait $pid3 
err3=$? 
wait $pid4 
err4=$? 

# Do something useful with the return codes... 
if [ $err1 -eq 0 -a $err2 -eq 0 -a $err3 -eq 0 -a $err4 -eq 0 ] 
then 
    echo "pass" 
else 
    echo "fail" 
fi 
+8

Да. Но хотелось добавить, что вы можете ждать только кода выхода pid, если этот pid является одним из ваших детей. –

+0

А, спасибо @Apprentice Queue, я этого не знал. –

+1

Это работает только в оболочке, из которой был вызван исходный процесс; а не для произвольного процесса. –

3

есть способ, я могу подождать, пока ПИД не будет завершена, и получить его код выхода

Да, если этот процесс не является ptrace d кем-то еще, вам может получить PTRACE_ATTACH и получать уведомления о различных событиях (например, полученных сигналах) и о его выходе.

Остерегайтесь, это довольно сложно правильно обрабатывать.

+0

будет ли он работать для произвольного процесса? от http://linux.die.net/man/2/ptrace - Системный вызов ptrace() предоставляет средство, с помощью которого процесс ** parent ** может наблюдать и контролировать выполнение другого процесса. – user1296013

+0

@ user1296013 Да, он будет работать для произвольного процесса (который уже не обрабатывается), для которого у вас есть разрешение (например, если вы можете его убить). Как только вы ptrace (PTRACE_ATTACH, ..) 'it, вы * станете * родителем. –

+0

@EmployedRussian Вы действительно должны добавить это в [Вики Грега] (http://mywiki.wooledge.org/ProcessManagement). – l0b0

6

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

$ strace -e none -e exit_group -p $PID  # process calls exit(1) 
Process 23541 attached - interrupt to quit 
exit_group(1)       = ? 
Process 23541 detached 

$ strace -e none -e exit_group -p $PID  # ^C at the keyboard 
Process 22979 attached - interrupt to quit 
--- SIGINT (Interrupt) @ 0 (0) --- 
Process 22979 detached 

$ strace -e none -e exit_group -p $PID  # kill -9 $PID 
Process 22983 attached - interrupt to quit 
+++ killed by SIGKILL +++ 

сигналы от ^Z, fg и kill -USR1 получить отпечатанные тоже. В любом случае вам нужно будет использовать sed, если вы хотите использовать код выхода в сценарии оболочки.

Если это слишком много кода оболочки, вы можете использовать program I hacked together in C a назад. Он использует ptrace(), чтобы поймать сигналы и коды выхода из pids. (Он имеет грубые края и может не работать во всех ситуациях.)

Надеюсь, что это поможет!

Смежные вопросы