在bash中杀死一个进程[重复]

Posted

技术标签:

【中文标题】在bash中杀死一个进程[重复]【英文标题】:kill a process in bash [duplicate] 【发布时间】:2011-02-16 00:42:34 【问题描述】:

如何杀死在 bash 中运行的进程 - 例如,假设我打开一个文件:

$ gedit 文件.txt

在命令提示符下有什么方法可以关闭它吗?这个例子相当简单,因为我可以关闭窗口,但它似乎出现了一点,尤其是当我输入错误的命令时。

还有什么方法可以逃脱正在运行的可执行文件?这可能有相同的解决方案,但我想我还是会问。

谢谢

【问题讨论】:

这看起来更像是一个 shell 使用问题而不是一个 shell 编程问题——脚本和交互式使用之间的最佳实践是不同的,后者属于超级用户而不是 SO。 我看不出这应该是链接问题的副本。这个问题询问关于终止当前终端中正在运行的进程。 “重复”问题询问有关查找某个任意进程的进程 ID 以进行杀戮。 【参考方案1】:

要中断它,您可以尝试按 ctrl c 发送 SIGINT。如果它没有阻止它,你可以尝试使用kill -9 <pid> 杀死它,它会发送一个 SIGKILL。后者不能被进程本身(被杀死的进程)忽略/拦截。

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

【讨论】:

我很惊讶还没有人提到 Ctrl-Z 或 Ctrl-C。 Ctrl-C 严厉地要求正在运行的程序退出。 Ctrl-Z 应该始终对程序起作用,但某些程序会使用信号处理程序覆盖 Ctrl-C,并且信号处理程序可能不会总是关闭程序。 ctrl z暂停进程后,可以用kill -9 %杀死它。 还要补充一点:如果进程对 Ctrl+C(发送 SIGINT)没有反应,您可以更粗暴一点,使用 Ctrl+\ 发送 SIGQUIT。 是不是键盘快捷键“Ctrl+C”比“Ctrl+Z”更适合“杀死bash中的进程”? 有时 CTRL+C 不会立即起作用。我只是用 Rails 试了一下,它一直在做它正在做的事情。使用kill -9 % 暂停和杀戮就像一种魅力!【参考方案2】:

这个是暴力使用慎用:

pkill -9 -e -f processname 

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

【讨论】:

【参考方案3】:

请检查“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

【讨论】:

【参考方案4】:

旧帖子,但我遇到了一个非常相似的问题。经过一些实验,我发现你可以用一个命令来做到这一点:

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

在 OP 的情况下,&lt;process_name&gt; 将是 "gedit file.txt"

【讨论】:

虽然看起来不错,但不起作用。但这有效:ps -ef | grep 你的进程 | awk '打印 $2' | xargs 杀死 分隔符不好。你应该先调整一下。这应该有效: kill -9 $(ps aux | grep "worker-manager-rsync" | grep -v "grep" |tr -s " "| cut -d " " -f 2) 有效!我只更改最后一位 kill $(ps aux | grep | grep -v "grep" | cut -d " " -f3)【参考方案5】:

您有多种选择:

首先,您可以使用kill。但是你需要你的进程的pid,你可以通过pspidof或者pgrep得到。

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>

您也可以将此选项与killkillall 一起使用。

阅读这篇关于controlling processes 的文章,以获取有关一般流程的更多信息。

【讨论】:

另一个选项是killall -9 &lt;procname&gt;,或者kill -9 pidof &lt;procname&gt; @jweyrich:谢谢 - 我编辑了我的答案以反映这一点。 小心killall。在 Solaris 上,killall 将终止所有活动进程。我建议使用killpkill 哦,好吧,我假设是 Linux。但你是对的,OP没有指定它。此外,pidof 实用程序仅在 Linux 上是标准配置。 +1,我以前用ps -e | grep 找到进程的 pid 然后用 'kill' 杀死它,这不太明智...但是 你也可以将此选项与 kill 和 killall 一起使用 ?如何 杀死只有名字?【参考方案6】:

我不清楚您所说的“转义正在运行的可执行文件”是什么意思,但是 ctrl-z 会将一个进程置于后台并将控制权返回给命令行。然后,您可以使用 fg 命令将程序带回前台。

【讨论】:

【参考方案7】:

试试kill -9 processID

要查找进程 ID,您可以使用 ps -ef | grep gedit

【讨论】:

-9 在正常进程上有点苛刻,你最好只在对“正常”终止请求没有反应的东西上使用它。 还可以考虑使用 pgrep 而不是 grepping ps -- 特别是在编写脚本时【参考方案8】:

您可以使用命令 pkill 杀死进程。如果你想“玩”,你可以使用“pgrep”,它的工作原理完全相同,但返回进程而不是杀死它。

pkill 具有 -f 参数,可让您匹配整个命令。因此,对于您的示例,您可以: pkill -f "gedit file.txt"

【讨论】:

以上是关于在bash中杀死一个进程[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 ProcessPoolExecutor 中杀死进程 [重复]

批处理文件或Powershell杀死进程[重复]

运行bash命令并在超过特定时间时将其杀死[重复]

在 C# 中,如何可靠地杀死进程树 [重复]

从python中杀死一个子进程,包括它的子进程[重复]

无法弄清楚如何在 Python 3.5 中杀死子进程 [重复]