如何使用单个命令解析ps输出来获取正在运行的进程的pid?


22

我正在寻找单行,它确实返回正在运行的进程的pid。

目前我有:

ps -A -o pid,cmd|grep xxx|head -n 1

这又回到了拳头pid, command。我只需要输出中的第一个数字,而忽略其余的。我想sedawk会在这里有所帮助,但我对他们的经验有限。

另外,这还有另一个问题,如果xxx没有运行,它将返回grep的pid。

一行很重要,因为我想重用输出来做其他事情,例如杀死该进程。


1
将其通过头传递,并指定要返回的行-n 1?
Mike McMahon

Answers:


28

如果您只想要过程的pid,可以使用它(pgrep如果有)。pgrep <command>会返回命令的pid(如果有多个正在运行的命令实例,则返回pid列表,在这种情况下,您可以使用head或其他合适的命令)
希望对您有所帮助!


+1我通常使用的pgrep:kill `pgrep xxx`
史蒂夫(Steve)

20
@steve:也许您应该看看pkill
暂停,直到另行通知。

7

只需要一个命令即可;您只需要一行用空格分隔的值的第一个字段:

ps -A -o pid,cmd|grep xxx | grep -v grep |head -n 1 | awk '{print $1}'

好吧,两个。我添加了另一个grep来从输出中删除grep本身。


6

只需使用pgrep,就更直接了

pgrep -o -x xxxx

上面选择了确切名称的最早的进程


并且由于OP希望使用命令来杀死进程,因此pkill(具有相同的args)将是最直接的选择。
bstpierre 2012年


0

在Cygwin上运行,因此我不能使用-A和-o,但是类似这样:

$ ps
      PID    PPID    PGID     WINPID   TTY     UID    STIME COMMAND
     4580       1    4580       4580  ?       55573   May 21 /usr/bin/mintty
     5808    7072    5808       7644  pty3    55573 13:35:31 /usr/bin/ps
     7072    5832    7072       6424  pty3    55573   May 21 /usr/bin/bash


$ ps | grep '/usr/bin/mintty' | head -n 1 | awk '{print $1}'
4580

0

你可以做类似的事情

ps -A -o cmd,pid | egrep "^xxx " | head -n 1 | sed -r -e 's/.* ([0-9]+)$/\1/'

那么xxx必须是进程名称,并且由于锚^,它不会选择grep

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.