您好我搜索了各种论坛,在这里,我可以找到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列)
任何建议都会有所帮助。
答案 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。