Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 如何通过在Mac OS X中提供进程名称来获取进程的PID?_Macos_Bash_Shell_Process_Pid - Fatal编程技术网

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

Macos 如何通过在Mac OS X中提供进程名称来获取进程的PID?,macos,bash,shell,process,pid,Macos,Bash,Shell,Process,Pid,我正在编写一个脚本来监视任何给定进程的CPU和MEM。为此,我需要将要监视的进程的名称作为命令行参数发送。比如说 ./monitorscript <pname> /monitorscript 我需要在脚本中获取进程的pid,以便在脚本中使用ps-p 给定进程名称,如何获取进程的pid 我知道可能有多个进程同名。我只想从列表中找出第一个进程 你可以试试这个 pid=$(ps -o pid=,comm= | grep -m1 $procname | cut -d' ' -f1) 上

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

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

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

我知道可能有多个进程同名。我只想从列表中找出第一个进程

你可以试试这个

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

上面的答案基本上是正确的,只是需要对MacOSX中的不同参数进行一些调整

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

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

这是我能找到的完成此任务的最短命令:

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

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

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

ps -Ac -o pid,comm | awk '/^ *[0-9]+ Dropbox$/ {print $1}'
此解决方案具有以下优点:

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

您可以通过以下方式安装
pidof

brew安装pidof
皮多夫

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


top-ocpup您可以像下面的示例一样使用pgrep命令

$ pgrep Keychain\ Access
44186
ps-oppid=$(ps-ax | grep进程名| awk'{print$1}')

打印更改的过程pid,然后打印父pid。然后,您可以终止父进程,也可以在以下命令中使用该parentPID来获取父进程的名称:

ps-p parentPID-o通信=



对我来说,家长是“登录”:\

如果
pgrep
可用,那么你可以说
pgrep进程\u name
。讨论OSXlight改进的可用性:删除进程路径以避免意外匹配,并匹配所有进程-使用
pid=$(ps-ceo…
。在终端中键入
echo“$(ps-ceo pid=,comm=| grep-m1 firefox | cut-d'-f1)”时,我没有收到任何响应。我做错什么了吗?grep的结果是'firefox bin 777
,3个空格,使用
cut-d'-f3` pid列是正确的,我没有测试这个。我想我会把它放在另一个答案中:-)如果应用程序运行这个返回正确的PID,但是如果特定的应用程序没有运行它返回一个不正确的数字。我使用的是os x 10.9,如果应用程序没有运行,它可能会返回grep进程的PID。看看我的答案。刚刚作为亚洲开发银行的pidof进行了测试,没有显示任何结果。为某个过程工作though@mohacs@stepmuel修复do
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搜索字符串中添加一个行尾锚点,以从输出中消除helper进程
ps-Ac | grep-m1'process$'| awk'{print$1}'
。最不花哨;最有用。这是一个很好的pidof Downvote源代码,因为使用了
brew
意味着macOS,其中
pgrep
存在于macOS上,基本上不使用第三方工具就提供相同的功能。这非常有用!非常感谢。工作得很好。如果要终止进程,请记住
pgrep
的兄弟
pkill
man pgrep
了解更多信息。从这个答案():“通过在字母周围加括号,在字符串周围加引号,您可以搜索正则表达式,它说:查找字符“f”,后跟“nord”。但是由于您在模式中加括号,“f”现在后跟“]”,因此grep不会出现在结果列表中。非常聪明!”。谢谢你的解释。这不是问题的重点。
$ pgrep Keychain\ Access
44186