Linux

如何獲取剛啟動程序的pid

  • June 22, 2018

我想啟動程序(例如 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你需要的時候。

引用自:https://serverfault.com/questions/205498