问题描述
我正在终端上运行一个程序,我无法用Ctrl
– C
转义,而且我想杀死它。我怎样才能找到它的PID?
最佳解决方法
打开另一个终端并运行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
每行输出的第一个字段是一个数字,表示与grep
匹配的程序的进程ID(您可以放心地忽略最后一个代表grep
本身的进程ID。
要停止违规流程,请执行:kill pid
其中,pid是程序的进程ID。您可能需要根据您的判断来确定哪些匹配项需要kill
编辑,或者您可以使用top
。使用kill
本身会发送SIGTERM,您应该先尝试一下,因为它允许程序自行清理完毕。如果SIGTERM失败,尝试SIGHUP,这是更强大的药物:kill -HUP pid
。如果一切都失败,发送SIGKILL。但是,作为最后的手段,你应该这么做,因为SIGKILL会导致内核立即终止进程,而无法进行清理。这有时会导致数据损坏或其他问题。所以再次,只发送SIGKILL作为最后的手段。为此,请执行kill -KILL pid
或kill -9 pid
。
如果你正在运行一个图形界面,当然,你不必用这个疯狂的命令行东西来完成工作。只需打开”System Monitor”,导航到进程选项卡,选择要停止的进程(嗯,它可能是使用90%CPU的那个?)和right-click它。由于进程已经停止,(这就是问题所在,对吗?)从结果菜单中选择End Process或Kill Process。
Credit to koanhead
次佳解决方法
当你用pgrep,pkill,pidof等完成相同的命令时,我认为不需要这么长的命令。
-
获取Running-Program的pid
p纤ep:
pgrep [options] pattern
描述:pgrep查看当前正在运行的进程并将与选择标准相匹配的进程ID列出到stdout。所有的标准必须匹配。例如,
-
查找由root拥有的名为sshd的进程。
$ pgrep -u root sshd
-
列出由root或守护进程拥有的进程。
$ pgrep -u root,daemon
的pidof:
描述:
Pidof找到指定程序的进程ID(pids)。它在标准输出上打印这些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
标志:列出进程名称以及进程标识。
第三种解决方法
知道正在运行的程序的pid的最简单方法是使用:
pidof <application name>
例如,如果你启动了vim并想知道它的pid:
pidof vim
请记住,您需要提供已启动的确切程序名称。
例如,如果您正在运行vi并执行pidof vim
,则不会得到正确的结果。
有关更多信息,请参阅pidof
的手册页。
第四种方法
我发现通过添加”-i”并使用”aux”而不是”ax”来获得更具描述性的输出,可以使用不区分大小写的搜索:
ps aux | grep -i firefox
如果你想杀死你可能使用的所有进程:
ps aux | grep -i firefox | awk {'print $2'} | xargs kill -9
这是一个强有力的杀戮。如果你想要杀软,那么放弃”-9″。
第五种方法
如果你只想要pid(对自动启动脚本等有用……)
pgrep -f desired_program_name