python 按名称而不是 PID 杀死 script.py

python kill script.py by name not PID

一个脚本在我的树莓派启动时自动启动,在这个脚本中有运动传感器,如果检测到,它会启动一个子进程camera.py(录制视频,然后转换视频和电子邮件)

在启动 u 的主脚本中,还有另一个 if 语句,如果按下按钮,则停止 camera.py 和其中的所有内容并执行其他操作。

我无法通过 PID 终止进程,因为它一直在变化。唯一的其他选择是通过它的名字杀死 camera.py,但它不起作用。

主脚本:

p1 = subprocess.Popen("sudo python /home/pi/camera.py", shell=True)

这是我的 camera.py 脚本:

import os
os.system("raspivid -n -o /home/pi/viseo.h264 -t 10000")
os.system(.... python script0.py
os.system(.... python script1.py

我能做到:

os.system("sudo killall raspivid")

如果我尝试

os.system("sudo killall camera.py")

它给我一条消息:找不到进程

这只会停止录制,但我也想杀死 camera.py

中的所有其他脚本

有人可以帮忙吗?谢谢

如果您使 camera.py 可执行,将其放在您的 $PATH 中并使脚本的第 1 行成为 #!/usr/bin/python,然后执行 camera.py 而无需 python 命令在它前面,您的 "sudo killall camera.py" 命令应该可以工作。

使用pkill:

$ sudo pkill -f camera.py 

而不是使用:

import os
os.system("raspivid -n -o /home/pi/viseo.h264 -t 10000")
os.system(.... python script0.py)
os.system(.... python script1.py)

您应该使用与生成此进程的方式相同的 Popen 结构。 这使您可以访问调用的 Popen 对象。

import os 
pvid = subprocess.Popen("raspivid -n -o /home/pi/viseo.h264 -t 10000")
p1 = subprocess.Popen(.... python script0.py)
p2 = subprocess.Popen(.... python script1.py)

然后你可以得到所有不同脚本的pid并通过它杀死它们。

这实际上应该通过关机序列来完成。 如果可以让它自行关闭,则永远不要强制关闭应用程序。