簡體   English   中英

Bash:為什么 kill -STOP 子進程使我的子進程和當前進程在 ps 中顯示相同的命令行

[英]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並顯示信息
  • 信息顯示子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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM