【问题标题】:python kill script.py by name not PIDpython kill script.py 按名称而不是 PID
【发布时间】:2016-02-04 15:14:51
【问题描述】:

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

在启动时启动你的主脚本中,还有另一个 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 中的所有其他脚本

有人可以帮忙吗?谢谢

【问题讨论】:

    标签: python linux kill


    【解决方案1】:

    使用pkill:

    $ sudo pkill -f camera.py 
    

    【讨论】:

    • 甜蜜!比我的选择好得多
    • 谢谢!但有时它可能很危险,因为它使用模式匹配。
    • 谢谢!!!!!!!这行得通,但是没有停止录制,而是杀死了 camera.py 中的所有其他脚本
    • 你应该只在绝对必要的情况下使用这种方法,暴力关闭应用程序/脚本正在等待问题和/或数据损坏。
    • @HeadhunterXamd 是的,我已经提到它有时很危险。
    【解决方案2】:

    如果你让 camera.py 可执行,把它放在你的 $PATH 上并在脚本的第 1 行设置#!/usr/bin/python,然后执行 camera.py 而不在它前面加上 python 命令,你的 "sudo killall camera.py" 命令应该可以工作。

    【讨论】:

      【解决方案3】:

      而不是使用:

      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 并通过它杀死它们。

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

      【讨论】:

      • 来自subprocess docs:“这个模块打算替换几个旧模块和功能:os.system os.spawn* os.popen* popen2.*命令。*”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 2019-01-10
      • 2016-05-02
      • 2021-08-09
      • 2014-05-01
      • 1970-01-01
      相关资源
      最近更新 更多