我是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
)信号强制进程立即停止执行。程序不能忽略该信号。此过程也无法进行清理。您必须使用kill语句发送SIGKILL标志。
kill -9 [pid]
如果不这样做,操作系统将选择在方便时终止该进程,SIGKILL (-9) 将告诉操作系统立即终止该进程,而不会忽略该命令,直到稍后。
试试这个 杀-9 它将杀死任何带有括号中给出的 PID 的进程
尝试“kill -9 $proid”或“kill -SIGKILL $proid”命令。如果您想了解更多信息,请点击。
根据您所拥有的内容,您似乎没有在
proid
变量中获得实际的 PID。如果您想捕获 pidof
的输出,则需要将该命令括在反引号中,以实现旧形式的 命令替换 ...
proid=`pidof $proceso`
...或者像新形式的命令替换一样。
proid=$(pidof $proceso)
我也有类似的问题,只想每天运行几个小时的监视器(视频监控)。 写了两个sh脚本;
cat startmotion.sh
#!/bin/sh
motion -c /home/username/.config/motion/motion.conf
第二个; 猫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
非常简单,但这就是我所需要的。
在 Mac 上:
如果端口是 8080 例如:
运行:
lsof -i :8080
你会得到这个:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 12345 user 12u IPv6 0t0 TCP *:http-alt (LISTEN)
运行:
kill -9 12345