如何根据进程名称获取pid

时间:2013-09-12 13:11:09

标签: unix ksh pid ps

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

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

以下是我从SO中找到的参考资料 This one And this one also

我在下面尝试了命令

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

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

任何建议都会有所帮助。

4 个答案:

答案 0 :(得分:69)

我认为使用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

答案 1 :(得分:6)

您可以使用 pidof 获取名称为p_name的正在运行的进程的所有ID pidof p_name | tr ' ' '\n'(垂直列表)
pkill p_name会终止名称为p_name的所有进程。 NB 确保您有权将其全部杀死:)

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

我的ps来自procps-ng。