我正在编写一个脚本来监视任何给定进程的CPU和MEM。为此,我需要将要监视的进程名称作为命令行参数发送。例如。
./monitorscript <pname>
我需要在脚本中获取进程的pid,以便可以在其中使用ps -p <pid>
。
如何根据进程名称获取进程的pid?
我知道可能存在多个相同名称的进程。我只想从该列表中获取第一个进程。
上面的答案基本正确,只需要针对Mac OSX中的不同参数进行一些微调。
ps -A | grep [f]irefox | awk '{print $1}'
ps -A | grep -m1 [f]irefox | awk '{print $1}'
。 - Motsel-m1
仅选择pid的第一个匹配项,这可能不是您想要的。ps -A
输出包括pid、tty、time和cmd列。cmd包括执行进程的完整命令。使用-c
标志将cmd列输出减少到仅包括进程名称。在grep搜索字符串中添加行尾锚点以消除输出中的辅助进程。ps -Ac | grep -m1 ‘process$’ | awk '{print $1}'
。 - pkfm你可以像下面的例子一样使用pgrep命令
$ pgrep Keychain\ Access
44186
pgrep
的兄弟命令 pkill
。更多信息请参阅 man pgrep
。 - inostia您可以使用Homebrew安装pidof
:
brew install pidof
pidof <process_name>
这个解决方案更加严格地匹配进程名称:
ps -Ac -o pid,comm | awk '/^ *[0-9]+ Dropbox$/ {print $1}'
tail -f ~/Dropbox
的命令行参数~/Dropbox/foo.sh
~/DropboxUID.sh
的进程 ps -ax | awk '/[t]he_app_name/{print $1}'
在第一个字母周围加上括号可以阻止awk找到awk进程本身。
试试这个:
echo "$(ps -ceo pid=,comm= | awk '/firefox/ { print $1; exit }')"
< p > ps
命令会产生这样的输出,第一列是 PID,第二列是可执行文件名(仅限于名称):
bookworm% ps -ceo pid=,comm=
1 launchd
10 kextd
11 UserEventAgent
12 mDNSResponder
13 opendirectoryd
14 notifyd
15 configd
...which awk
处理,打印第一列(pid),并在第一个匹配后退出。
你可以试试这个
pid=$(ps -o pid=,comm= | grep -m1 $procname | cut -d' ' -f1)
pid = $(ps -ceo ...)
。 - Nicholas Rileyecho "$(ps -ceo pid=,comm= | grep -m1 firefox | cut -d' ' -f1)"
时,我没有得到任何响应。我做错了什么吗? - Pradepfirefox-bin 777
,有 3 个空格,请使用 cut -d' ' -f3
。 - jackjr300ps -o ppid=$(ps -ax | grep nameOfProcess | awk '{print $1}')
输出变化的进程PID,然后是父进程PID。您可以杀死父进程,或者使用该parentPID在以下命令中获取父进程的名称:
ps -p parentPID -o comm=
对我来说,父进程是'login' :\
pgrep
可用,你只需输入pgrep 进程名称
。这篇文章讨论了在OSX上可用的pgrep
。 - another.anon.coward