如何根据进程名称获取进程ID

74
嗨,我在各个论坛和这里进行了搜索,我找到了一些关于Linux和Mac的答案,但是没有找到关于Unix和特别是Korn Shell的解决方案。
如何从进程ID(PID)获取进程名称(命令名称)。
我在Stack Overflow上找到了以下参考资料 这个 还有这个 我尝试了下面的命令
ps -eaf | awk '{ print substr($0, index($0, $9)) }'

上述命令在给出时间而不是月份和日期的情况下失败(因为在这种情况下字符串中只有8列)。
任何建议都将有所帮助。

不,我想从进程名称获取进程ID,在标题中打错了。 - gahlot.jaggs
这个问题非常特定于您的Unix版本,与shell关系不大。请包括uname -a的输出。 - Henk Langeveld
对于使用 Mac 的用户,也可以参考 https://dev59.com/E2gu5IYBdhLWcg3wJD2b。 - jvriesem
4个回答

118

我认为使用pgrep更容易。

$ pgrep bluetoothd
441

否则,您可以使用 awk:
ps -ef | awk '$8=="name_of_process" {print $2}'

例如,如果ps -ef有如下一行:
root       441     1  0 10:02 ?        00:00:00 /usr/sbin/bluetoothd

然后,ps -ef | awk '$8=="/usr/sbin/bluetoothd" {print $2}' 返回441


在ksh中找不到pgrep。另一种解决方案在以下情况下失败: ps命令的输出如下:jaggsmca325 7550 4752 0 Sep 11 pts/44 0:00 sqlplus dummy_user/dummy_password@dummy_schema

让我们检查最后一列($NF),无论其数字是多少:

$ ps -ef | awk '$NF=="/usr/sbin/bluetoothd" {print $2}'
441

如果你想匹配不完全相符的字符串,可以使用 ~
$ ps -ef | awk '$NF~"bluetooth" {print $2}'
441
1906

在ksh中找不到pgrep。另一个解决方案在以下情况下失败,输出自ps命令:jaggsmca325 7550 4752 0 Sep 11 pts/44 0:00 sqlplus dummy_user/dummy_password@dummy_schema - gahlot.jaggs
我尝试了您的解决方案,它基本上是有效的,但在进程名称包含空格的地方失败,例如:ps -eaf | awk '$NF=="sshd: jaggsmca325@pts/53" {print $2}' 有关该问题的任何指针?是的,我想精确匹配进程名称。 - gahlot.jaggs
@gahlot.jaggs,由于我使用了$NF,你也可以使用$(NF-1)等。因此,你可以使用$(NF-1)=="sshd:" && $NF=="jaggsmca325@pts/53" - fedorqui
感谢您的所有努力,但我无法在运行时知道那时会有多少令牌,因此我不能使用$(NF-1),否则它将仅固定为N-1,并且对于其他情况将失败。是否有任何方法可以通过使用进程名称而不是使用ps -eaf来查找进程ID? - gahlot.jaggs
@gahlot.jaggs 你也可以使用 grep "process$",因为 $ 表示行尾。然后将字符串传递给 awk 命令以打印第二个记录。 - fedorqui
显示剩余3条评论

13
你可以使用pidof命令获取名为p_name的所有正在运行的进程的ID:

pidof p_name | tr ' ' '\n' (垂直列出)

pkill p_name - 结束所有名为p_name的进程

请确保您有权限结束它们 :)


1
pidof 可以用于长度超过 15 个字符的进程名。 - nurettin

1
如果您的ps | awk解决方案失败,因为ps的输出不是您想要的,请进行更改:
ps -eaf -o pid,cmd | awk '/regex-to-match-command-name/{ print $1 }'

它说 ps:非法选项--o - gahlot.jaggs
2
ps 根据您的平台而异(但我认为 -o 是标准的)。请查看您的文档以了解如何操作输出字段。(man ps - William Pursell
ps 命令还支持 o(不带 -)和 --format,具体取决于您的平台。 - go2null

1
ps -C <the-name> -o etime=

我的ps命令来自procps-ng。


我也使用 ps -C <进程名称> -o user= | head -1 来获取进程所有者(用户)。 - vladkras

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接