64

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

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

下面是我从 SO This one 和 this one中找到的参考资料

我试过下面的命令

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

上面的命令在给出 TIME 而不是 Month 和 Date 的地方失败(因为在这种情况下,字符串中只有 8 列)

任何建议都会有所帮助。

4

4 回答 4

98

我认为它更容易使用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
于 2013-09-12T13:22:24.377 回答
12

您可以使用pidof以下名称获取正在运行的进程的所有 ID p_name

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

pkill p_name- 杀死所有同名的进程p_name

确保您有权将他们全部杀死:)

于 2016-04-26T20:52:14.353 回答
1

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

ps -eaf -o pid,cmd | awk '/regex-to-match-command-name/{ print $1 }'
于 2013-09-12T13:23:51.343 回答
1
ps -C <the-name> -o etime=

我的 ps 来自 procps-ng 。

于 2018-12-12T19:44:58.890 回答