如何在给定进程名称的情况下获取 pid
Posted
技术标签:
【中文标题】如何在给定进程名称的情况下获取 pid【英文标题】:How to get pid given the process name 【发布时间】:2013-09-16 21:37:08 【问题描述】:您好,我搜索了各种论坛,也在这里,我可以找到一些适用于 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 列)
任何建议都会有所帮助。
【问题讨论】:
不,我想要进程名称中的 pid,标题输入错误 这个问题与您的 unix 版本非常相关,与 shell 几乎没有关系。请包含uname -a
的输出。
对于碰巧发现此问题的 Mac 用户,另请参阅 ***.com/questions/11546765/…。
【参考方案1】:
您可以使用pidof
获取名称为p_name
的正在运行进程的所有ID:
pidof
p_name | tr ' ' '\n'
(用于垂直列表)
pkill
p_name
- 杀死名称为p_name
的所有进程
确保您有权将他们全部杀死:)
【讨论】:
pidof 适用于超过 15 个字符的进程名称【参考方案2】:ps -C <the-name> -o etime=
我的 ps 来自 procps-ng。
【讨论】:
我也使用ps -C <process-name> -o user= | head -1
来获取进程所有者(用户)【参考方案3】:
我觉得用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
的输出,则另一个解决方案将失败
我尝试了您的解决方案,它非常有效,但在进程名称具有如下空格的情况下失败了 ps -eaf | awk '$NF=="sshd: jaggsmca325@pts/53" print $2' 任何指向该问题的指针?是的,我想获得匹配的确切进程名称。
@gahlot.jaggs 我用$NF
,你也可以用$(NF-1)
等,所以你可以用$(NF-1)=="sshd:" && $NF=="jaggsmca325@pts/53"
感谢您的所有努力,但我不知道在运行时我会有多少令牌,所以我不能使用 $(NF-1) 否则它将被固定为 N-仅 1 并且在其他情况下将失败。有什么方法可以通过使用进程名称而不是使用 ps -eaf 来找到进程 ID
@gahlot.jaggs 您也可以grep "process$"
,因为$
表示行尾。然后将字符串提供给 awk 以打印第二条记录。【参考方案4】:
如果您的 ps | awk
解决方案失败,因为 ps
的输出不是您想要的,那么就这样吧:
ps -eaf -o pid,cmd | awk '/regex-to-match-command-name/ print $1 '
【讨论】:
上面写着 ps: 非法选项 -- ops
因您的平台而异(但我认为-o
是标准的)。检查您的文档以了解如何操作输出字段。 (man ps
)
ps
还支持o
(不带-
)和--format
,具体取决于您的平台。以上是关于如何在给定进程名称的情况下获取 pid的主要内容,如果未能解决你的问题,请参考以下文章