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

时间:2012-07-18 17:11:37

标签: macos bash shell process pid

我正在编写一个脚本来监视任何给定进程的CPU和MEM。为此,我需要将要监视的进程的名称作为命令行参数发送。例如。

./monitorscript <pname>

我需要在脚本中获取进程的pid,以便我可以在内部使用ps -p <pid>

如何根据流程名称获取流程的pid?

据我所知,同一个名称可能有多个进程。我只想从该列表中获取第一个进程。

9 个答案:

答案 0 :(得分:66)

上面的答案大多是正确的,只需要对Mac OSX中的不同参数进行一些调整。

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

答案 1 :(得分:28)

您可以使用Homebrew安装pidof

brew install pidof
pidof <process_name>

答案 2 :(得分:27)

您可以使用pgrep命令,如以下示例中所示

$ pgrep Keychain\ Access
44186

答案 3 :(得分:4)

这是我能找到的最短的命令:

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

在第一个字母周围放置括号会阻止awk找到awk进程本身。

答案 4 :(得分:2)

试试这个:

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

ps命令产生这样的输出,第一列中的PID和第二列中的可执行名称(仅):

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

... awk处理,打印第一列(pid)并在第一场比赛后退出。

答案 5 :(得分:2)

此解决方案更严格地匹配流程名称:

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

该解决方案具有以下优点:

  • 它会忽略tail -f ~/Dropbox
  • 之类的命令行参数
  • 它会忽略~/Dropbox/foo.sh
  • 等目录中的进程
  • 忽略名为~/DropboxUID.sh
  • 的进程

答案 6 :(得分:1)

你可以试试这个

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

答案 7 :(得分:0)

ps -o ppid = $(ps -ax | grep nameOfProcess | awk'{print $ 1}')

先打印更改过程的pid,然后打印父PID。然后可以杀死父进程,也可以在以下命令中使用该parentPID来获取父进程的名称:

ps -p parentPID -o comm =

对我来说,父母是“登录”:\

答案 8 :(得分:-2)

为什么不运行TOP并使用选项按PID以外的其他指标排序?比如,来自CPU / MEM的最高使用PID?

top -o cpu&lt; ---按CPU使用率排序所有进程