如何獲取剛啟動程序的pid
我想啟動程序(例如 myCommand)並獲取它的 pid(以便稍後殺死它)。
我嘗試了 ps 並按名稱過濾,但我無法按名稱區分程序
myCommand ps ux | awk '/<myCommand>/ {print $2}'
因為程序名稱不是唯一的。
我可以通過以下方式執行流程:
myCommand &
我發現我可以通過以下方式獲取此 PID:
echo $!
有沒有更簡單的解決方案?
我很樂意執行 myCommand 並通過一行命令獲取其 PID。
有什麼比 更簡單的
echo $!
呢?一行:myCommand & echo $!
您甚至可以在命令執行之前
sh -c
使用andexec
獲取命令的 PID 。要啟動
myCommand
,以便在它開始執行之前列印其 PID,您可以使用:sh -c 'echo $$; exec myCommand'
這個怎麼運作:
這將啟動一個新的 shell,列印該 shell 的 PID,然後使用
exec
內置命令將 shell替換為您的命令,確保它具有相同的 PID。當您的 shell 使用exec
內置命令執行命令時,您的 shell實際上正在成為該命令,而不是派生一個新副本的更常見行為,該副本具有自己的單獨 PID,然後成為命令。
&
我發現這比涉及非同步執行(使用)、作業控製或使用搜尋的替代方案要簡單得多ps
。這些方法很好,但除非你有特定的理由使用它們——例如,命令可能已經在執行,在這種情況下搜尋它的 PID 或使用作業控制是有意義的——我建議先考慮這種方式。(我當然不會考慮編寫複雜的腳本或其他程序來實現這一點)。這個答案包括這種技術的一個例子。
該命令的某些部分偶爾會被省略,但通常不會。
即使您使用的 shell 是 Bourne 風格的,因此支持
exec
具有這些語義的內置函式,您通常也不應該嘗試避免使用sh -c
(或等效的)為此目的創建一個新的、單獨的shell 程序,因為:
- 一旦 shell 變為
myCommand
,就沒有 shell 等待執行後續命令。將自身替換為 後將sh -c 'echo $$; exec myCommand; foo
無法嘗試執行。除非您正在編寫一個將其作為最後一個命令執行的腳本,否則您不能只在執行其他命令的 shell 中使用。foo``myCommand``echo $$; exec myCommand
- 您不能為此使用子shell。
(echo $$; exec myCommand)
可能在語法上比 更好sh -c 'echo $$; exec myCommand'
,但是當你在$$
裡面執行時(
)
,它給出了父 shell 的 PID,而不是子 shell 本身的 PID。但是子shell 的PID 將成為新命令的PID。一些 shell 提供了它們自己的不可移植機制來查找子 shell 的 PID,您可以使用它。特別是,在 Bash 4中,(echo $BASHPID; exec myCommand)
確實有效。最後,請注意,當已知 shell 之後不需要執行任何操作時,某些 shell 將執行優化,在它們執行命令時就像 by (即,它們首先放棄分叉)。
exec
一些 shell 嘗試在它是最後一個執行的命令時執行此操作,而其他 shell 僅在命令之前或之後沒有其他命令時才執行此操作,而其他 shell 則根本不執行此操作。效果是,如果您忘記編寫exec
而只是使用,sh -c 'echo $$; myCommand'
那麼它有時會在某些帶有一些shell的系統上為您提供正確的 PID 。我建議不要依賴這種行為,而是總是包括exec
你需要的時候。