我是linux新手,正在编写一个程序,输入进程名称,获取其PID(这部分没问题),然后将PID传递给kill命令,但是它无法正常工作。大致代码如下:
read -p "Process to kill: " proceso
proid= pidof $proceso
echo "$proid"
kill $proid
有人能告诉我为什么它没有被杀死吗?我知道还有其他一些方法可以做到,甚至使用PID,但是对我来说都不起作用。我相信这是Bash语言的某种问题(我刚刚开始学习)。
我是linux新手,正在编写一个程序,输入进程名称,获取其PID(这部分没问题),然后将PID传递给kill命令,但是它无法正常工作。大致代码如下:
read -p "Process to kill: " proceso
proid= pidof $proceso
echo "$proid"
kill $proid
有人能告诉我为什么它没有被杀死吗?我知道还有其他一些方法可以做到,甚至使用PID,但是对我来说都不起作用。我相信这是Bash语言的某种问题(我刚刚开始学习)。
改为此方式:
proid= pidof $proceso
您可能指的是这个:proid=$(pidof $proceso)
kill PID
发送 TERM
信号到指定的进程,给它一个机会以有序的方式关闭,例如清理它正在使用的资源。发送一个最强的信号来杀死进程而不进行优雅的清理是使用 KILL
,使用 kill -KILL PID
或 kill -9 PID
。
我认为这是 bash 语言的某种问题(我刚开始学习)。
你发布的原始行,proid= pidof $proceso
应该会引发一个错误,并且 Bash 会打印一个错误消息。调试问题始于阅读和理解软件试图告诉你的错误消息。
kill 命令需要你告诉它 **如何杀死** 进程,因此有64种不同的方法可以杀死进程 :) 它们都有名称和编号。其中最致命的是 -9
。一些有趣的信号包括:
-9
) 信号强制进程立即停止执行。程序无法忽略此信号。该进程也没有机会进行清理。我遇到了一个类似的问题,只想每天运行几个小时的监控(视频监视)。 写了两个sh脚本;
cat startmotion.sh
#!/bin/sh
motion -c /home/username/.config/motion/motion.conf
#!/bin/sh
OA=$(cat /var/run/motion/motion.pid)
kill -9 $OA
ctontab -e
0 15 * * * /home/username/startmotion.sh
0 17 * * * /home/username/killmotion.sh
非常简单,但这就是我所需要的全部。
proid
变量中没有获取到实际的PID。如果你想要捕获pidof
的输出,你需要用反引号将该命令括起来,这是旧形式的命令替换。proid=`pidof $proceso`
...或者对于新形式的命令替换也可以这样。
proid=$(pidof $proceso)
你必须在kill语句中发送SIGKILL标志。
kill -9 [pid]
如果你不这样做,操作系统将选择在方便的时候杀死进程,而SIGKILL(-9)会告诉操作系统立即杀死进程,而不会忽略命令直到以后。