【问题标题】:How to get pid given the process name如何在给定进程名称的情况下获取 pid
【发布时间】: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 用户,另请参阅 stackoverflow.com/questions/11546765/…

标签: unix ksh pid ps


【解决方案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,具体取决于您的平台。
猜你喜欢
  • 2014-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多