如何通过在Mac OS X中提供进程名称来获取进程的PID?

问题描述:

我正在编写一个脚本来监视任何给定进程的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

答案上面主要是正确的,只是需要一些调整在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

你可以试试这个

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

尝试这一个:

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)并在第一次匹配后退出。

这是我能找到的,没有工作的最短命令:

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

该溶液中的过程名称匹配更严格:

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

这种解决方案具有以下优点:

  • 它忽略命令行参数等tail -f ~/Dropbox
  • 它忽略像目录中的过程~/Dropbox/foo.sh
  • 它忽略名称为~/DropboxUID.sh

您可以安装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

你为什么不跑TOP和使用的选项由其他指标进行排序,除了PID?就像CPU/MEM中使用最多的PID一样?

顶部-o CPU < ---排序由CPU使用的所有过程

+0

这不是问题的关键。 – bergercookie 2017-05-19 22:37:56

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

$ pgrep Keychain\ Access 
44186 
+0

这非常有用!谢谢! – 2016-04-04 19:50:23