如何在给定进程名称的情况下获取 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 &lt;process-name&gt; -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:" &amp;&amp; $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: 非法选项 -- o ps 因您的平台而异(但我认为-o 是标准的)。检查您的文档以了解如何操作输出字段。 (man ps) ps 还支持o(不带-)和--format,具体取决于您的平台。

以上是关于如何在给定进程名称的情况下获取 pid的主要内容,如果未能解决你的问题,请参考以下文章

Linux运维必知:如何从其 PID 中查找进程名称

如何在python中获取名称的进程ID

如何在脚本中获取进程ID

如何在最后一个子 fork() 下打印带有名称和 pid 的子进程

如何在C#中获取给定服务的子进程列表?

Win7 下DELPHI如何通过进程名获取路径