2012-03-27 21 views
6

Có cách nào để đợi cho đến khi quá trình kết thúc nếu tôi không phải là người đã bắt đầu nó?Đợi quá trình tùy ý và lấy mã thoát của nó trong Linux

ví dụ: nếu tôi chạy "ps -ef" và chọn bất kỳ PID nào (giả sử tôi có quyền truy cập thông tin quy trình) - có cách nào tôi có thể đợi cho đến khi PID hoàn tất và lấy mã thoát của nó không?

Trả lời

0

Nếu bạn biết quá trình ID, bạn có thể tận dụng các lệnh wait mà là một BUILTIN bash:

wait PID 

Bạn có thể lấy PID của lệnh chạy cuối cùng trong bash sử dụng $!. Hoặc, bạn có thể grep cho nó với từ đầu ra của ps.

Thực tế, lệnh chờ là một cách hữu ích để chạy lệnh parralel trong bash. Dưới đây là một ví dụ:

# 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

Có. Nhưng muốn thêm rằng bạn chỉ có thể chờ mã thoát của pid nếu pid đó là một trong số các con của bạn. –

+0

Ah, cảm ơn @Apprentice Queue, tôi không biết điều đó. –

+1

Điều này chỉ hoạt động trong trình bao mà từ đó quy trình gốc đã được gọi; không cho một quá trình tùy ý. –

3

được Có cách nào tôi có thể chờ cho đến khi PID hoàn thành và nhận được mã lối ra của nó

Vâng, nếu quá trình này là không được ptrace d bởi người khác, bạn có thể PTRACE_ATTACH với nó, và nhận được thông báo về các sự kiện khác nhau (ví dụ như tín hiệu nhận được), và về lối ra của nó.

Hãy coi chừng, điều này khá phức tạp để xử lý đúng cách.

+0

nó sẽ làm việc cho quá trình tùy ý? từ http://linux.die.net/man/2/ptrace - Lệnh gọi hệ thống ptrace() cung cấp phương tiện mà quy trình ** mẹ ** có thể quan sát và kiểm soát việc thực hiện quy trình khác .. – user1296013

+0

@ user1296013 Có, nó sẽ làm việc cho quá trình tùy ý (mà không phải là ptraced đã) mà bạn có sự cho phép (ví dụ nếu bạn có thể giết nó). Một khi bạn 'ptrace (PTRACE_ATTACH, ..)' nó, bạn * trở thành * cha mẹ. –

+0

@EmployedRussian Bạn thực sự nên thêm điều này trong [Wiki của Greg] (http://mywiki.wooledge.org/ProcessManagement). – l0b0

6

Bạn có thể sử dụng strace, theo dõi tín hiệu và cuộc gọi hệ thống. Lệnh chờ đợi cho đến khi sau một chương trình được thực hiện, sau đó in mã lối ra của nó:

$ 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 +++ 

Tín hiệu từ ^Z, fgkill -USR1 được in quá. Dù bằng cách nào, bạn sẽ cần sử dụng sed nếu bạn muốn sử dụng mã thoát trong tập lệnh trình bao.

Nếu quá nhiều mã shell, bạn có thể sử dụng program I hacked together in C một lúc trở lại. Nó sử dụng ptrace() để bắt tín hiệu và mã thoát của pids. (Nó có các cạnh thô và có thể không hoạt động trong mọi tình huống.)

Tôi hy vọng điều đó sẽ hữu ích!

Các vấn đề liên quan