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

Pra*_*dep 40 macos bash shell pid process

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

./monitorscript <pname>
Run Code Online (Sandbox Code Playgroud)

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

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

我知道同名中可能有多个进程.我只想从该列表中获取第一个进程.

小智 70

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

ps -A | grep [f]irefox | awk '{print $1}'
Run Code Online (Sandbox Code Playgroud)

  • 如果应用程序未运行,则可能返回grep进程的PID.看看我的回答. (4认同)
  • 如果应用程序正在运行,则返回正确的 PID,但如果该特定应用程序未运行,则返回不正确的数字。我在 os x 10.9 (2认同)
  • 许多进程都与以基本进程的名称作为前缀的辅助进程相关联。例如 process-helper、processd、processScriptRunner 等。 `-m1` 只会选择所有匹配中的第一个 pid,这可能不是你想要的。`ps -A` 输出包含 pid、tty、time 和 cmd 列。cmd 包含执行进程的完整命令。使用 `-c` 标志将 cmd 列输出减少到仅进程名称。将行尾锚点添加到 grep 搜索字符串以消除输出中的辅助进程。`ps -Ac | grep -m1 '进程$' | awk '{print $1}'`。 (2认同)

小智 35

你可以pidofHomebrew安装:

brew install pidof
pidof <process_name>
Run Code Online (Sandbox Code Playgroud)

  • 最不花哨;最有用。 (5认同)
  • 投反对票是因为使用暗示 macOS 的“brew”,其中“pgrep”存在于 macOS 上,并且在不使用第三方工具的情况下提供基本相同的功能。 (3认同)

ber*_*kie 33

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

$ pgrep Keychain\ Access
44186
Run Code Online (Sandbox Code Playgroud)


ste*_*uel 7

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

ps -Ac -o pid,comm | awk '/^ *[0-9]+ Dropbox$/ {print $1}'
Run Code Online (Sandbox Code Playgroud)

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

  • 它忽略命令行参数,如 tail -f ~/Dropbox
  • 它忽略目录内的进程,如 ~/Dropbox/foo.sh
  • 它忽略名称如下的进程 ~/DropboxUID.sh


pha*_*ann 5

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

ps -ax | awk '/[t]he_app_name/{print $1}'
Run Code Online (Sandbox Code Playgroud)

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