我正在终端中运行一个无法使用Ctrl-C退出并且想要杀死的程序。如何找到其PID?

评论

这是Ubuntu死机时我该怎么办?作为防止该问题的细节过于技术化的参考。

有一个pidof命令。

#1 楼

打开另一个终端并运行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本身的代码。使用您的判断来判断哪些匹配项需要kill pid ed,或者您可以使用kill本身使用top会发送SIGTERM,您应该首先尝试使用SIGTERM,因为这样可以使程序在其自身之后正确清理。 ,请尝试使用SIGHUP,这是更便宜的药:kill。如果其他所有方法均失败,请发送SIGKILL。但是,您只能作为最后的选择,因为SIGKILL会导致内核立即终止进程,而无法进行清理。时间会导致数据损坏或其他问题。再次,仅发送S IGKILL作为最后的手段。为此,请执行kill -HUP pidkill -KILL pid。只需打开“系统监视器”,导航到“进程”选项卡,选择要暂停的进程(Hm,它可能是使用90%CPU的进程吗?),然后右键单击它。由于该进程已经停止,(这是问题所在,对吗?)从结果菜单中选择“结束进程”或“终止进程”。

评论


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

–斯科特遣散费
2012年8月26日上午10:04

如何找到自定义函数的pid。我有一个函数,其中包含带有ping命令和睡眠的循环。根据unix.stackexchange.com/a/275826/72988的说法,在没有多路复用器的Ubuntu中是不可能的。

– Timo
18年2月3日,9:27

#2 楼

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


要获取运行中的pid,程序

pgrep:

   pgrep [options] pattern


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



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

$ pgrep -u root sshd



列出root OR守护程序拥有的进程。

$ pgrep -u root,daemon



> pidof:

描述:

Pidof查找指定程序的进程ID(PID)。它会在标准输出上打印这些ID。

语法: br />示例:

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。



评论


这是最好的答案

–BlackDivine
18年1月12日在10:17

#3 楼

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

pidof <application name>


例如,如果您启动vim并想知道其pid: br />
pidof vim


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

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

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

评论


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

– flickerfly
2014年9月19日19:24在

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

– Pathros
18年6月13日在15:18

#4 楼

我发现最好使用不区分大小写的搜索,方法是添加“ -i”并使用“ aux”而不是“ ax”来获得更具描述性的输出:
br />如果您想杀死所有进程,则可以使用:

ps aux | grep -i firefox


这是一个有力的杀死方法。如果您想进行软杀,请放下“ -9”。

评论


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

–埃里克
2014年7月21日在9:41

@Eric您可以使用grep -i firefo [x]仅匹配firefox

– A.D.
16年4月22日在9:36

@ john-foley绝不建议将-9与kill配合使用,请参见此处以获取解释

– A.D.
16年4月22日在9:38

#5 楼

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

pgrep -f desired_program_name


#6 楼

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

评论


我喜欢ps -e(显示全部)和ps -ejH(显示进程树)。

–安德鲁(Andrew)
19年6月25日在15:13

@Andrew很好,这实际上很可爱-感谢小费

–cygnus_x1
19年10月1日在16:34

#7 楼

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

#8 楼

您可以执行以下操作:

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


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

评论


kill -9是您必须杀死进程的最大枪支。首先,您应该尝试使用更柔和的信号,然后再诉诸SIGKILL,使该过程有机会清理其资源。

–Byte Commander♦
16-09-27在21:30

没错,@ ByteCommander。我想把它做成可以完成工作的衬板。

–阿里安(Arian Soltani)
16/09/28'6:40

#9 楼

top




screen -list|ls


列出所有具有相应过程的pid

kill -[pid]