2012-07-18 973 views
24

我正在編寫一個腳本來監視任何給定進程的CPU和MEM。爲此,我需要發送被監控進程的名稱作爲命令行參數。例如。如何通過在Mac OS X中提供進程名稱來獲取進程的PID?

./monitorscript <pname> 

我需要得到進程的PID的腳本,這樣我可以使用ps -p <pid>內。

我如何獲得給定進程名稱的進程的PID?

我知道可能有多個進程同名。我只想從列表中獲得第一個進程。

+6

如果'pgrep'可用,那麼你可以說'pgrep process_name'。 [本文](http://unix.stackexchange.com/questions/225/pgrep-and-pkill-alternatives-on-mac-os-x)介紹OSX上的'pgrep'可用性 – 2012-07-18 17:21:29

回答

47

答案上面主要是正確的,只是需要一些調整在Mac OSX上的不同的參數。

ps -A | grep -m1 firefox | awk '{print $1}' 
+0

如果應用程序正在運行此返回正確的PID,但如果該特定的應用程序未運行,則返回一個不正確的數字。我在操作系統x 10.9 – mohacs 2014-04-10 22:22:33

+1

如果應用程序未運行,它可能會返回grep進程的PID。看看我的答案。 – stepmuel 2014-08-10 14:15:23

+0

剛剛作爲pidof adb進行測試,沒有出現任何結果。在某些過程中工作 – anything 2017-04-25 13:45:08

1

你可以試試這個

pid=$(ps -o pid=,comm= | grep -m1 $procname | cut -d' ' -f1) 
+0

稍作改進:刪除進程的路徑,所以你不會發生意外匹配,並匹配所有進程 - 使用'pid = $(ps -ceo ...)'。 – 2012-07-18 17:27:44

+0

當我在終端輸入「echo」$(ps -ceo pid =,comm = | grep -m1 firefox | cut -d''-f1)「''時,我沒有收到任何迴應。難道我做錯了什麼 ? – Pradep 2012-07-18 17:36:49

+0

grep的結果是'firefox-bin 777',3個空格,使用'cut -d''-f3' – jackjr300 2012-07-18 19:32:55

2

嘗試這一個:

bookworm% ps -ceo pid=,comm= 
    1 launchd 
    10 kextd 
    11 UserEventAgent 
    12 mDNSResponder 
    13 opendirectoryd 
    14 notifyd 
    15 configd 

echo "$(ps -ceo pid=,comm= | awk '/firefox/ { print $1; exit }')" 

ps命令在第一列和可執行文件的名稱(僅)在第二列產生輸出這樣的,與PID

...其中awk處理,打印第一列(pid)並在第一次匹配後退出。

4

這是我能找到的,沒有工作的最短命令:

ps -ax | awk '/[t]he_app_name/{print $1}' 

把周圍的第一個字母括號從發現awk的過程本身AWK停止。

+0

方括號如何在此解決方案中工作? – Floris 2016-08-05 17:09:01

+0

從這個答案(http://unix.stackexchange.com/a/74186):「通過括號括起來的字母和引號圍繞字符串搜索正則表達式,其中說:找到字符'f'後面跟着'nord',但由於您將括號放在'f'中,現在後面跟着']',所以grep不會顯示在結果列表中。 – phatmann 2016-08-08 18:07:57

+0

非常聰明。感謝您的解釋。 – Floris 2016-08-08 19:29:05

2

該溶液中的過程名稱匹配更嚴格:

ps -Ac -o pid,comm | awk '/^ *[0-9]+ Dropbox$/ {print $1}' 

這種解決方案具有以下優點:

  • 它忽略命令行參數等tail -f ~/Dropbox
  • 它忽略像目錄中的過程~/Dropbox/foo.sh
  • 它忽略名稱爲~/DropboxUID.sh
16

您可以安裝pidofHomebrew

brew install pidof 
pidof <process_name> 
+0

最少看中;最有用。 – Nate 2016-01-13 20:14:46

+0

這是一個非常好的簡單解決方案!感謝你! – 2017-02-12 23:39:58

+0

這是一個很好的pidof源碼https://www.cyberciti.biz/faq/linux-pidof-command-examples-find-pid-of-program/ – 2017-06-15 01:32:52

-2

你爲什麼不跑TOP和使用的選項由其他指標進行排序,除了PID?就像CPU/MEM中使用最多的PID一樣?

頂部-o CPU < ---排序由CPU使用的所有過程

+0

這不是問題的關鍵。 – bergercookie 2017-05-19 22:37:56

12

您可以在下面的例子中使用pgrep命令狀

$ pgrep Keychain\ Access 
44186 
+0

這非常有用!謝謝! – 2016-04-04 19:50:23