在bash中终止进程

103

如何在bash中结束正在运行的进程 - 例如,假设我打开了一个文件:

$ gedit file.txt

有没有办法在命令提示符内关闭它?这个例子很简单,因为我可以关闭窗口,但是这种情况似乎经常发生,特别是当我输入命令时出错。

另外,有没有办法终止正在运行的可执行文件?这可能有相同的解决方案,但我还是想问一下。

谢谢


这更像是一个关于shell使用的问题,而不是一个关于shell编程的问题 - 最佳实践在脚本和交互式使用之间是不同的,后者应该放在超级用户而不是SO上。 - Charles Duffy
我不认为这应该是链接问题的重复。这个问题询问如何杀死在当前终端中运行的进程。而“重复”的问题则询问如何查找某个任意进程的进程ID以进行杀死。 - luator
8个回答

97

你有多种选择:

首先,你可以使用kill。但是你需要知道你的进程的pid,可以通过使用pspidofpgrep来获取。

ps -A  // to get the pid, can be combined with grep
-or-
pidof <name>
-or-
pgrep <name>

kill <pid>

只知道进程名称也可以杀死该进程。使用 pkillkillall 命令。

pkill <name>
-or-
killall <name>

所有命令都会向该进程发送信号。如果进程挂起,可能需要向进程发送sigkill信号(这是信号编号9,因此以下示例执行相同操作):

pkill -9 <name>
pkill -SIGKILL <name>
你还可以在使用 "kill" 和 "killall" 命令时加上该选项。请阅读控制进程这篇文章,了解更多关于进程的信息。

2
小心使用 killall。在Solaris上,killall会终止所有活动进程。我建议使用killpkill - David Narayan
噢,我以为是Linux。但你说得对,原帖没有指定。 此外,“pidof”实用程序仅在Linux上标准化。 - jweyrich
1
+1,我曾经使用 ps -e | grep <name> 命令来查找进程的 pid,然后用 'kill' 命令杀死它,这并不是很明智...但是 _你也可以在 kill 和 killall 命令中使用这个选项_?如何只通过名称 杀死 进程? - Gnijuohz
@Gnijuohz:我所说的选项是 -SIGKILL。如果要按名称杀死进程,最好使用 pkill - tanascius

92

要中断它,可以尝试按下ctrlc发送SIGINT信号。如果无法停止它,您可以尝试使用kill -9 <pid>来结束它,该命令会发送一个SIGKILL信号。后者不能被进程本身(即被终止的进程)忽略/拦截。

要将活动进程移至后台,可以按下ctrlz。进程将被发送到后台,然后您将返回到shell提示符。使用fg命令执行相反操作。


7
我很惊讶还没有人提到Ctrl-Z或Ctrl-C。 Ctrl-C会强制要求正在运行的程序退出。 在一些程序中,Ctrl-Z应该总是有效的,但有些程序会用信号处理程序来覆盖Ctrl-C,并且该信号处理程序可能不会关闭程序。 - Joey Adams
4
在使用<kbd>ctrl</kbd>+<kbd>z</kbd>暂停进程后,你可以用 kill -9 % 命令结束它。 - luator
1
还有一件事要补充:如果进程不对 Ctrl+C(发送 SIGINT)做出反应,您可以更加强硬地使用 Ctrl+\ 发送 SIGQUIT。 - luator
“Ctrl+C”这个键盘快捷键比“Ctrl+Z”更适合在Bash中“杀死一个进程”,不是吗? - computingfreak
有时候按下CTRL+C并不能立刻中止程序。我刚在Rails中尝试了一下,但它仍旧继续运行。暂停并使用 kill -9 % 命令杀掉进程完美解决了问题! - Qasim

10

尝试使用kill -9 {processID}命令。

要找到进程ID,可以使用ps -ef | grep gedit命令。


6
-9 对于一个正常的进程来说有点过于严厉,你最好只在那些不会对“普通”的 kill 请求做出反应的东西上使用它。 - Simon Groenewolt
2
在编写脚本时,特别是在写脚本时,请考虑使用 pgrep 而不是 grep ps。 - Charles Duffy

5

虽然这篇文章有些年头了,但我最近也遇到了类似的问题。经过一番尝试,我发现你可以通过一个单独的命令来解决:

kill $(ps aux | grep <process_name> | grep -v "grep" | cut -d " " -f2)

在OP的情况下,<process_name>将是"gedit file.txt"

4
看起来不错但是没有效果。但是这个命令有效:ps -ef | grep yourproc | awk '{print $2}' | xargs kill - Timo
2
分隔符不好。在此之前,您应该进行调整。这应该可以工作:kill -9 $(ps aux | grep“worker-manager-rsync”| grep -v“grep”| tr -s“”| cut -d“”-f 2) - ikken
可以工作!我只改变了最后一个数字。 kill $(ps aux | grep <process_name> | grep -v "grep" | cut -d " " -f3) - El David
Cut在这种情况下是无用的。它不理解多个空格是一个分隔符的概念,也没有单词的概念。 - Tuntable

4
这个需要谨慎使用,具有暴力倾向:
pkill -9 -e -f processname 

如果您的进程名称是"sh",它也会杀死"bash"。

1

您可以使用命令pkill来终止进程。如果您想要“玩一下”,可以使用“pgrep”,它的工作方式完全相同,但是返回进程而不是终止它。

pkill具有-f参数,允许您与整个命令匹配。因此,对于您的示例,您可以执行以下操作:pkill -f“gedit file.txt”


0

我不清楚你所说的“逃脱正在运行的可执行文件”是什么意思,但是ctrl-z可以将进程放到后台并返回控制命令行。然后,您可以使用fg命令将程序带回前台。


0
请检查 "top" 命令,如果您的脚本或任何程序正在运行,请注意 'PID'。
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 1384 root      20   0  514m  32m 2188 S  0.3  5.4  55:09.88 example
14490 root      20   0 15140 1216  920 R  0.3  0.2   0:00.02 example2



kill <you process ID>

Example : kill 1384

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接