[英]Bash: why kill -STOP a child process makes my child and current process to show the same command line in ps
我在腳本中有這段代碼。 這是一個名為test.sh
的腳本,用於說明它:
#!/bin/bash
$@ &
pid=$!
#kill -STOP $pid
echo "PID = $pid"
echo '$@ = '"$@"
ps -p $pid -o uname,pid,command
echo
ps -A -o uname,pid,stat,command | grep 'script.sh' | grep -v grep
#kill -CONT $pid
wait $pid
exit 0
kill
命令被注釋掉,這是有意的。 發生的事情是:
./test.sh ./script.sh
test.sh
啟動./script.sh
,記錄其PID
並顯示信息./script.sh
的進程
root@test# ./test.sh ./script.sh
PID = 53370
$@ = ./script.sh
USER PID COMMAND
root 53370 /bin/bash ./script.sh <-- Child process
USER PID STAT COMMAND
root 53369 S+ /bin/bash ./test.sh ./script.sh <-- Current process
root 53370 S+ /bin/bash ./script.sh <-- Child process
一切正常。
現在,如果我取消注釋kill
命令,腳本將顯示以下信息:
root@test# ./test.sh ./script.sh
PID = 53422
$@ = ./script.sh
USER PID COMMAND
root 53422 /bin/bash ./test.sh ./script.sh <-- Child process
USER PID STAT COMMAND
root 53421 S+ /bin/bash ./test.sh ./script.sh <-- Current process
root 53422 T+ /bin/bash ./test.sh ./script.sh <-- Child process
我不確定為什么當我掛起我的子進程時,我在ps
輸出中為我的當前進程和我的子進程獲得完全相同的COMMAND
值。
為什么會這樣? 在這種情況下,我想了解父進程和子進程之間的機制。
因為您已經在fork()
和execve()
之間停止了孩子,然后才能執行script.sh
腳本。
在kill -STOP
前加一個sleep 1
看看效果。
fork()
將子進程創建為父進程的副本(這意味着它將以相同的進程名稱、命令行參數以及除 pid 之外的幾乎所有其他內容顯示在ps
輸出中)。 當子execve()
調用execve()
系統調用時,它會替換所有這些。
在fork()
,無法保證父進程或子進程中的哪一個先運行(事實上,它們可以在不同的處理器上同時運行,或者它們中的任何一個都可以無限期地被搶占)——以及任何“哲學" 從它們彼此執行不同操作的順序得出的結論是完全沒有意義的;-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.