我正在编写一个脚本来监视任何给定进程的CPU和MEM。为此,我需要将要监视的进程的名称作为命令行参数发送。例如。
./monitorscript <pname>
我需要在脚本中获取进程的pid,以便我可以在内部使用ps -p <pid>
。
如何根据流程名称获取流程的pid?
据我所知,同一个名称可能有多个进程。我只想从该列表中获取第一个进程。
答案 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使用率排序所有进程