gpt4 book ai didi

macos - 如何从进程名称中获取进程ID?

转载 作者:行者123 更新时间:2023-11-29 08:58:27 24 4
gpt4 key购买 nike

我正在尝试创建一个 shell 脚本,以获取我 Mac 上 Skype 应用程序的进程 ID

ps -clx | grep 'Skype' | awk '{print $2}' | head -1

上面的工作正常,但是有两个问题:

1)grep 命令将获取所有名称仅包含“Skype”的进程。如果进程名称恰好是 Skype,我如何确保它只获得结果?

2)我想从中制作一个 shell 脚本,它可以从终端使用,但进程名称应该是这个脚本的参数:

#!/bin/sh

ps -clx | grep '$1' | awk '{print $2}' | head -1

这没有返回任何东西。我认为这是因为 awk 中的 $2 也被视为参数。我该如何解决这个问题?

最佳答案

您的 ps -cl1 输出如下所示:

  UID   PID  PPID        F CPU PRI NI       SZ    RSS WCHAN     S             ADDR TTY           TIME CMD
501 185 172 104 0 31 0 2453272 1728 - S ffffff80145c5ec0 ?? 0:00.00 httpd
501 303 1 80004004 0 31 0 2456440 1656 - Ss ffffff8015131300 ?? 0:11.78 launchd
501 307 303 4004 0 33 0 2453456 7640 - S ffffff8015130a80 ?? 0:46.17 distnoted
501 323 303 40004004 0 33 0 2480640 9156 - S ffffff80145c4dc0 ?? 0:03.29 UserEventAgent

因此,每行的最后一个条目是您的命令。这意味着您可以使用正则表达式的全部功能来帮助您。

正则表达式中的$表示字符串结束,因此可以使用$来指定不仅输出必须有Skype 中,它必须以 Skype 结尾。这意味着如果您有一个名为 Skype Controller 的命令,您将不会将其拉起:

ps -clx | grep 'Skype$' | awk '{print $2}' | head -1

您还可以使用 ps -o 格式来简化事情,只提取您想要的列:

ps -eo pid,comm | grep 'Skype$' | awk '{print $1}' | head -1

并且,您可以通过简单地使用 awk 为您选择行的功能来消除 head。在 awk 中,NR 是您的记录号。因此你可以这样做:

ps -eo pid,comm | grep 'Skype$' | awk 'NR == 1 {print $1}'

哎呀,现在我想起来了,我们也可以去掉 grep:

ps -eo pid,comm | awk '/Skype$/  {print $1; exit}'

这是利用 awk 使用正则表达式的能力。如果该行包含正则表达式“Skype$”,它将打印第一列,然后退出

唯一的问题是,如果您有一个命令 Foo Skype,这也会将其拾取。要消除这种情况,您必须做一些更花哨的步法:

ps -eo pid,comm | while read pid command
do
if [[ "$command" = "Skype" ]]
then
echo $pid
break
fi
done

while read 正在读取两个变量。诀窍是 read 使用空格来分隔它读入的变量。但是,由于只有两个变量,最后一个将包含整行的其余部分。因此,如果命令是 Skype Controller,整个命令将被放入 $command 中,即使其中有一个空格也是如此。

现在,我们不必使用正则表达式。我们可以将命令与相等性进行比较。

输入时间较长,但实际上您使用的命令和管道更少。请记住 awk 循环遍历每一行。你在这里所做的只是让它更明确。最后,这实际上比您原来的效率高得多。

关于macos - 如何从进程名称中获取进程ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9415740/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com