Python杀死一个子进程(启动另一个进程)并再次启动它

标签 python linux subprocess

我正在尝试制作一个 python 脚本来启动程序 livestreamer(启动程序 mplayer)并在 10 秒后它应该终止程序或子进程。这是我当前的代码不起作用,我想我知道为什么,但我不知道如何解决。 我认为问题在于子进程启动了 livestreamer,然后程序 livestreamer 启动了程序 mplayer。 Python 不了解 mplayer 并且无法关闭它。我怎样才能在 10 秒后同时杀死 livestreamer 和 mplayer,然后再次循环启动它们? 我正在使用 Ubuntu 14.04 (Linux) 和 Python 2.7.6

import subprocess
import time
import os
import sys
import signal

url = "http://new.livestream.com/accounts/398160/events/3155348"
home = os.environ['HOME']

if not os.geteuid() == 0:
    if not os.path.exists('/%s/.config/livestreamer' % home):
        os.makedirs('/%s/.config/livestreamer' % home)
    lscfg = open('%s/.config/livestreamer/config' % home, 'w+')
    lscfg.write("player=mplayer -geometry 0%:0% -nomouseinput -loop 100 -noborder -fixed-vo")
    lscfg.close()

cmd = "livestreamer %s best --player-continuous-http --player-no-close" % url
while True:
    proc1 = subprocess.Popen(cmd.split(), shell=False)
    time.sleep(10)
    proc1.kill()

解决方案:

import subprocess
import time
import os
import sys
import signal

url = "http://new.livestream.com/accounts/398160/events/3155348"
home = os.environ['HOME']

if not os.geteuid() == 0:
    if not os.path.exists('/%s/.config/livestreamer' % home):
        os.makedirs('/%s/.config/livestreamer' % home)
    lscfg = open('%s/.config/livestreamer/config' % home, 'w+')
    lscfg.write("player=mplayer -geometry 0%:0% -nomouseinput -loop 100 -noborder -fixed-vo")
    lscfg.close()
cmd = "livestreamer %s best --player-continuous-http --player-no-close" % url
#restarting the player every 10th minute to catch up on possible delay
while True:
    proc1 = subprocess.Popen(cmd.split(), shell=False)
    time.sleep(600)
    os.system("killall -9 mplayer")
    proc1.kill()

如您所见,os.system("killall -9 mplayer") 是终止进程 mplayer 的命令。

最佳答案

在您的代码中,您杀死了 livestreamer 但没有杀死 mplayer,因此 mplayer 将继续运行。

通过在你的子进程上使用 kill 你发送一个信号 SIGKILL 并且除非子进程确实处理信号中断它会简单地快速关闭自己并且不会杀死他自己的 child 所以 mplayer 将存活(并且可能成为僵尸进程)。

你没有引用你的子进程'mplayer',但如果你能得到他的 PID,你可以用 os.kill(...) 杀死它

os.kill(process_pid, signal.SIGTERM)

关于Python杀死一个子进程(启动另一个进程)并再次启动它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26527024/

相关文章:

python - 在 Python 中传播 gRPC 上下文

python - 当我无法提前知道字符编码时,如何打印字符串列表?

python - 如何在 Pandas 中过滤分组依据

python - 在 python 中执行自定义 bash 函数

python - 重新使用和关闭子流程对象的正确方法

python - 计算偏置隐藏层

r - H2O:无法通过 `h2o.loadModel` 从磁盘读取大型模型

MySQL/phpMyAdmin 重置 ROOT 密码?

linux - 如何为所有用户设置所有 ulimits 无限制?