56

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

./monitorscript <pname>

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

给定进程名称,如何获取进程的 pid?

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

4

9 回答 9

91

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

ps -A | grep [f]irefox | awk '{print $1}'
于 2012-07-18T17:52:41.380 回答
55

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

$ pgrep Keychain\ Access
44186
于 2016-02-28T16:38:52.153 回答
47

您可以pidof使用Homebrew安装:

brew install pidof
pidof <process_name>
于 2015-02-24T10:31:39.430 回答
7

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

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

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

  • 它忽略命令行参数,如tail -f ~/Dropbox
  • 它会忽略目录中的进程,例如~/Dropbox/foo.sh
  • 它忽略名称如下的进程~/DropboxUID.sh
于 2014-08-10T14:10:11.727 回答
6

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

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

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

于 2013-08-07T08:34:06.043 回答
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)并在第一次匹配后退出。

于 2012-07-18T23:59:20.143 回答
1

你可以试试这个

pid=$(ps -o pid=,comm= | grep -m1 $procname | cut -d' ' -f1)
于 2012-07-18T17:20:09.367 回答
0

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

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

ps -p parentPID -o comm=

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

于 2020-09-22T00:27:46.120 回答
-2

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

top -o cpu <---按CPU使用率对所有进程进行排序

于 2016-02-23T16:05:17.553 回答