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

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

$ gedit 文件.txt

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

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

谢谢

【问题讨论】:

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

标签: bash


【解决方案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"

        【讨论】:

          猜你喜欢
          • 2020-09-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-04
          • 2013-05-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多