如何找到正在运行的终端程序的进程ID(PID)?


Answers:


127

打开另一个终端并运行ps ax | grep foo,其中foo是无响应程序的名称。这应该返回一行输出,如下所示:

$ ps ax | grep firefox
2222 ?        S      0:00 /bin/sh /usr/lib/firefox-3.6.9/firefox
2231 ?        Sl   514:36 /usr/lib/firefox-3.6.9/firefox-bin
30290 pts/2    S+     0:00 grep --color=auto firefox

输出的每一行的第一个字段是一个数字,表示与之匹配的程序的进程ID grep(您可以放心地忽略最后一个表示grep自身的ID 。

要停止有问题的进程,请执行以下操作: kill pid其中pid是程序的进程ID。您可能需要根据需要判断哪些匹配项做出判断kill,或者可以使用它top来代替。kill单独使用会发送SIGTERM,您应该首先尝试使用它,因为它可以使程序在执行完之后自行正确清理。如果SIGTERM失败,请尝试SIGHUP,这是更健康的药物:kill -HUP pid。如果其他所有方法均失败,请发送SIGKILL。但是,您只能这样做是万不得已的方法,因为SIGKILL会使内核立即终止进程,而无法进行清理。有时可能会导致数据损坏或其他问题。再次重申,仅发送SIGKILL作为最后的手段。为此,请执行kill -KILL pidkill -9 pid

当然,如果您运行的是图形界面,则不必笨拙地使用这些疯狂的命令行来完成工作。只需打开“系统监视器”,导航到“进程”选项卡,选择要暂停的进程(Hm,是否可能是使用90%CPU的进程?),然后右键单击它。由于该进程已经停止,(这是问题所在,对吗?)从结果菜单中选择“结束进程”或“终止进程”。

感谢koanhead


5
除非所有其他方法都失败了,否则人们永远不要使用SIGKILL(杀死-9)。只列出kill -9是不好的建议。我已经编辑了答案以进行更正。
Scott Severance,2012年

如何找到自定义函数的pid。我有一个函数,其中包含带有ping命令和的循环sleep。根据unix.stackexchange.com/a/275826/72988,如果没有Ubuntu,则无法在Ubuntu中进行multiplexer
蒂莫,

47

当您可以使用pgrep,pkill,pidof等完成相同的命令时,我认为不需要这么长的命令...

  • 获取正在运行的程序的pid

pgrep:

   pgrep [options] pattern

描述: pgrep浏览当前正在运行的进程,并列出与选择标准匹配到stdout的进程ID。所有条件都必须匹配。例如,

  • 查找root拥有的名为sshd的进程。

    $ pgrep -u root sshd
    
  • 列出root OR守护程序拥有的进程。

    $ pgrep -u root,daemon
    

pidof:

说明

Pidof查找命名程序的进程ID(PID)。它在标准输出上打印这些id。

语法: pidof program_name

  • 要使用pid杀死程序,请使用pkill示例:

    pkill pid    
    pkill -f process_name    
    pkill -o process_name    
    pkill -n process_name    
    pkill -l process_name
    

    -f标志:搜索process_name(请参阅man pkill)
    -o标志:仅选择最旧的匹配进程。
    -n标志:仅选择最新的匹配过程。
    -l标志:列出进程名称和进程ID。


1
这是最好的答案
BlackDivine

20

知道正在运行的程序的pid的最简单方法是使用:

pidof <application name>

例如,如果您启动了vim并想知道其pid:

pidof vim

请记住,您将需要提供已启动的确切程序名称。

例如,如果您运行vi并执行pidof vim,将不会得到正确的结果。

pidof有关更多信息,请参见的手册页。


默认情况下未安装。它可能在sysvinit-utils软件包中。
flickerfly 2014年

我有MariaDB。pidof mysqld返回PID。但是,如果键入,则pidof Mariadb不会返回任何内容。MariaDB和MySQL是否使用相同的PID?
Pathros

18

我发现最好使用不区分大小写的搜索,方法是添加“ -i”并使用“ aux”而不是“ ax”来获得更具描述性的输出:

ps aux | grep -i firefox

如果您想终止所有进程,可以使用:

ps aux | grep -i firefox | awk {'print $2'} | xargs kill -9

那是一个有力的杀戮。如果您想进行软杀,请放下“ -9”。


5
这也杀死了ps aux | grep -i firefox...进程,因为firefox它的命令中包含文本!
埃里克

1
@Eric您可以grep -i firefo[x]用来只匹配firefox
AD

@约翰-弗利永远不会建议使用-9kill,看到这里的解释
公元

3

如果只需要pid(可用于自动终止脚本等)

pgrep -f desired_program_name

1

对于那些运行Ubuntu 16.04 LTS的用户,必须使用ps ax而不是仅ps在命令行中使用,否则,您只会从所处的特定终端实例中获得生成的进程。(通常只是“ bash” [您所在的shell] ]和'ps'[您刚刚运行的内容])


我喜欢ps -e(显示全部)和ps -ejH(显示过程树)。
安德鲁

1
@Andrew不错,这实际上很可爱-感谢您的提示
cygnus_x1

0

您还可以打开另一个终端(或切换到另一个tty)并运行top,这基本上是系统监视器的文本版本。第一列列出了每个正在运行的进程的PID,您可以通过按K,输入PID,然后输入要发送的数字信号将其杀死。


0

您可以这样做:

ps ax | grep firefox | cut -f2 -d" " - | xargs kill -9

前两个管道获取过程信息,接下来我们尝试通过使用老式剪切来获取PID列,然后将生成的PID杀死。


kill -9是您杀死进程的最大武器。首先,您应该尝试使用更柔和的信号,然后再诉诸SIGKILL,使该过程有机会清理其资源。
字节指挥官

没错,@ ByteCommander。我想把它做成可以完成工作的衬板。
阿里安·索塔尼

0
top

要么

screen -list|ls

列出所有pid和相应的进程

kill -[pid]
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.