如何根据进程名称获取pid

问题描述 投票:0回答:4

您好,我搜索了各种论坛,在这里,我可以找到一些针对 Linux 和 Mac 的答案,但无法找到针对 Unix,特别是 Korn Shell 的解决方案。

如何从进程id(pid)获取进程名(命令名)

下面是我从SO找到的参考资料 这个 还有这个

我尝试了以下命令

ps -eaf | awk '{ print substr($0, index($0, $9)) }'

上面的命令在给出 TIME 而不是月份和日期时失败(因为在这种情况下,字符串中只有 8 列)

任何建议都会有所帮助。

unix ksh pid ps
4个回答
114
投票

我觉得比较好用

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

13
投票

您可以使用

pidof
来获取所有名为
p_name
的正在运行的进程的 ID:

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

pkill
p_name
- 终止所有名为
p_name

的进程

确保你有权杀死他们所有人:)


1
投票

如果您的

ps | awk
解决方案因
ps
的输出不是您想要的而失败,那么请这样做:

ps -eaf -o pid,cmd | awk '/regex-to-match-command-name/{ print $1 }'

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

我的 ps 来自 procps-ng 。

© www.soinside.com 2019 - 2024. All rights reserved.