在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 的情况下,<process_name>
将是 "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您有多种选择:
首先,您可以使用kill。但是你需要你的进程的pid,你可以通过ps、pidof或者pgrep得到。
ps -A // to get the pid, can be combined with grep
-or-
pidof <name>
-or-
pgrep <name>
kill <pid>
只要知道名称就可以杀死一个进程。使用pkill 或killall。
pkill <name>
-or-
killall <name>
所有命令都向进程发送信号。如果进程挂起,可能需要向进程发送sigkill(这是信号编号 9,因此以下示例也是如此):
pkill -9 <name>
pkill -SIGKILL <name>
您也可以将此选项与kill
和killall
一起使用。
阅读这篇关于controlling processes 的文章,以获取有关一般流程的更多信息。
【讨论】:
另一个选项是killall -9 <procname>
,或者kill -9 pidof <procname>
@jweyrich:谢谢 - 我编辑了我的答案以反映这一点。
小心killall
。在 Solaris 上,killall
将终止所有活动进程。我建议使用kill
或pkill
。
哦,好吧,我假设是 Linux。但你是对的,OP没有指定它。此外,pidof
实用程序仅在 Linux 上是标准配置。
+1,我以前用ps -e | grep 我不清楚您所说的“转义正在运行的可执行文件”是什么意思,但是 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中杀死一个进程[重复]的主要内容,如果未能解决你的问题,请参考以下文章