【问题标题】:How to kill a process by its pid in linux如何在linux中通过pid杀死进程
【发布时间】:2015-12-31 19:39:42
【问题描述】:

我是 linux 新手,我正在构建一个程序,它接收进程的名称,获取它的 PID(我对那部分没有问题),然后将 PID 传递给 kill 命令,但它不起作用。它是这样的:

read -p "Process to kill: " proceso
proid= pidof $proceso
echo "$proid"
kill $proid

谁能告诉我为什么它没有杀死它?我知道还有其他一些方法可以做到这一点,即使使用 PID,但它们似乎都不适合我。我认为这是 Bash 语言(我刚开始学习)的某种问题。

【问题讨论】:

    标签: linux bash process command kill


    【解决方案1】:

    使用以下命令显示进程的端口和PID:

    sudo netstat -plten 
    

    然后

    kill -9 PID
    

    这是一个杀死在端口 8283 上运行且 PID=25334 的进程的示例

    【讨论】:

      【解决方案2】:

      我有类似的问题,只想每天运行几个小时的监视器(视频监控)。 写了两个sh脚本;

      cat startmotion.sh

      #!/bin/sh
      motion -c /home/username/.config/motion/motion.conf
      

      还有第二个; cat killmotion.sh

      #!/bin/sh
      OA=$(cat /var/run/motion/motion.pid)
      kill -9 $OA
      

      这些是在预定时间从 crontab 调用的

      ctontab -e
      0 15 * * * /home/username/startmotion.sh
      0 17 * * * /home/username/killmotion.sh
      

      非常简单,但这就是我所需要的。

      【讨论】:

        【解决方案3】:

        而不是这个:

        proid= pidof $proceso
        

        你可能是这个意思:

        proid=$(pidof $proceso)
        

        即便如此, 该程序可能不会被杀死。 默认情况下,kill PID 向指定进程发送TERM 信号, 给它一个有序关闭的机会, 例如清理它正在使用的资源。 在没有优雅清理的情况下发送进程杀死的最强信号是KILL,使用kill -KILL PID 或kill -9 PID。


        我认为这是 bash 语言(我刚开始学习)的某种问题。

        您发布的原始行 proid= pidof $proceso 应该会引发错误, 并且 Bash 会打印一条关于它的错误消息。 调试问题首先要阅读并理解软件试图告诉您的错误消息。

        【讨论】:

        • 非常感谢大家!我尝试了您所有的解决方案,但问题就在您指出的地方。不知道我必须把所有的表达式都放在 () 和 $ 开头。我现在会更关心它,谢谢!
        【解决方案4】:

        根据您所拥有的,您似乎没有在 proid 变量中获得实际的 PID。如果要捕获pidof 的输出,则需要将该命令括在command substitution 的旧形式的反引号中...

        proid=`pidof $proceso`
        

        ... 或类似的新形式的命令替换。

        proid=$(pidof $proceso)
        

        【讨论】:

        • 在你们告诉我之后我意识到哈哈非常感谢!
        【解决方案5】:

        kill 希望您告诉它**如何杀死*,因此必须有 64 种不同的方法来杀死您的进程:) 它们有名称和编号。最致命的是-9。一些有趣的包括:

        • SIGKILL - SIGKILL(也称为-9)信号强制进程立即停止执行。程序不能忽略此信号。此过程也不会进行清理。
        • SIGHUP - SIGHUP 信号将进程与父进程断开连接。这也可用于重新启动进程。例如,“killall -SIGUP compiz”将重新启动 Compiz。这对于存在内存泄漏的守护进程很有用。
        • SIGINT - 此信号与按 ctrl-c 相同。在某些系统上,“delete”+“break”向进程发送相同的信号。该过程被中断并停止。但是,该进程可以忽略此信号。
        • SIGQUIT - 这类似于 SIGINT,能够使进程产生核心转储。

        【讨论】:

          【解决方案6】:

          尝试“kill -9 $proid”或“kill -SIGKILL $proid”命令。如果您想了解更多信息,请click。

          【讨论】:

          【解决方案7】:

          试试这个 杀死 -9 它将杀死任何带有括号中的PID的进程

          【讨论】:

            【解决方案8】:

            您必须在 kill 语句中发送 SIGKILL 标志。 kill -9 [pid] 如果您不这样做,操作系统会在方便时选择终止该进程,SIGKILL (-9) 将告诉操作系统现在终止该进程而不忽略该命令,直到稍后。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-03-02
              • 2014-11-24
              • 2021-11-29
              • 1970-01-01
              • 2013-10-14
              • 2014-09-07
              • 1970-01-01
              • 2020-01-07
              相关资源
              最近更新 更多