【问题标题】:How to get the PID of a process by giving the process name in Mac OS X ?如何通过在 Mac OS X 中给出进程名称来获取进程的 PID?
【发布时间】:2012-07-17 19:21:49
【问题描述】:

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

./monitorscript <pname>

我需要在脚本中获取进程的 pid,以便我可以在里面使用 ps -p &lt;pid&gt;。

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

我了解可能有多个同名进程。我只想从该列表中删除第一个进程。

【问题讨论】:

  • 如果pgrep 可用,那么你可以说pgrep process_name。 This post 谈论 pgrep 在 OSX 上的可用性

标签: macos bash shell process pid


【解决方案1】:

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

ps -A | grep [f]irefox | awk '{print $1}'

【讨论】:

  • 如果应用程序正在运行,则返回正确的 PID,但如果该特定应用程序未运行,则返回不正确的数字。我在 os x 10.9
  • 如果应用没有运行,它可能会返回 grep 进程的 PID。看看我的回答。
  • 刚刚测试为 pidof adb,没有任何显示。虽然工作了一些过程
  • @mohacs @stepmuel 解决这个问题ps -A | grep -m1 [f]irefox | awk '{print $1}'
  • 许多进程都与以基本进程名称作为前缀的辅助进程相关联。例如 process-helper、processd、processScriptRunner 等。-m1 只会选择 pid 的第一个匹配项,这可能不是您想要的。 ps -A 输出包含 pid、tty、time 和 cmd 列。 cmd 包括执行该进程的完整命令。使用 -c 标志将 cmd 列输出减少为仅进程名称。将行尾锚添加到 grep 搜索字符串以从输出中消除辅助进程。 ps -Ac | grep -m1 ‘process$’ | awk '{print $1}'.
【解决方案2】:

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

$ pgrep Keychain\ Access
44186

【讨论】:

  • 这很有用!谢谢!
  • 效果很好。如果您想终止进程,请记住pgrep 的兄弟pkill 也很有帮助。 man pgrep 了解更多信息。
【解决方案3】:

你可以用Homebrew安装pidof:

brew install pidof
pidof <process_name>

【讨论】:

【解决方案4】:

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

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

此方案具有以下优点:

  • 它会忽略像tail -f ~/Dropbox 这样的命令行参数
  • 它会忽略像~/Dropbox/foo.sh 这样的目录中的进程
  • 它会忽略名称如~/DropboxUID.sh 的进程

【讨论】:

    【解决方案5】:

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

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

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

    【讨论】:

    • 来自这个答案 (unix.stackexchange.com/a/74186):“通过将括号括在字母周围并在字符串周围加上引号,您可以搜索正则表达式,它表示:查找字符 'f' 后跟 'nord' . 但是,由于您将括号放在模式 'f' 中,现在后面是 ']',所以 grep 不会出现在结果列表中。整洁!”
    • 非常聪明。谢谢你的解释。
    【解决方案6】:

    试试这个:

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

    【讨论】:

      【解决方案7】:

      你可以试试这个

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

      【讨论】:

      • 轻微改进:删除进程路径,以免意外匹配,并匹配所有进程 - 使用pid=$(ps -ceo ...)。
      • 当我在终端输入echo "$(ps -ceo pid=,comm= | grep -m1 firefox | cut -d' ' -f1)" 时没有得到任何响应。我做错了吗?
      • grep 的结果是`firefox-bin 777, 3 spaces, use cut -d' ' -f3`
      • pid列是右对齐的,我没有测试这个。我想我会把它放在另一个答案中:-)
      【解决方案8】:

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

      打印出变化的进程 pid,然后是父 PID。然后您可以杀死父进程,或者您可以在以下命令中使用该 parentPID 来获取父进程的名称:

      ps -p parentPID -o comm=

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

      【讨论】:

        【解决方案9】:

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

        top -o cpu

        【讨论】:

        • 问题不是这个。
        猜你喜欢
        • 1970-01-01
        • 2011-02-04
        • 1970-01-01
        • 1970-01-01
        • 2014-12-28
        • 2011-05-10
        • 1970-01-01
        相关资源
        最近更新 更多