如何通过 linux 中的 pid 终止进程

How to kill a process by its pid in linux

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

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

有人能告诉我为什么它没有杀死它吗?我知道还有一些其他方法可以做到这一点,即使使用 PID,但其中 none 似乎对我有用。我相信这是 Bash 语言(我刚开始学习)的某种问题。

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

而不是这个:

proid= pidof $proceso

你可能是这个意思:

proid=$(pidof $proceso)

即便如此, 该程序可能不会被杀死。 默认情况下,kill PID向指定进程发送TERM信号, 让它有机会有序地关闭, 例如清理它正在使用的资源。 使用 kill -KILL PIDkill -9 PID.

发送进程以在没有优雅清理的情况下终止的最强信号是 KILL

I believe it's some kind of problem with the bash language (which I just started learning).

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

试试这个 杀死-9 它会杀死括号中给出的 PID 的任何进程

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

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

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

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

的反引号中
proid=`pidof $proceso`

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

proid=$(pidof $proceso)

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

猫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

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

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

sudo netstat -plten 

然后

kill -9 PID

这是一个终止进程 运行 在端口 8283 上并且 PID=25334

的例子