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

时间:2014-10-23 11:27:26

标签: python linux subprocess

我正在尝试创建一个启动程序livestreamer的python脚本(启动程序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的命令。

2 个答案:

答案 0 :(得分:0)

在你的代码中,你杀了livestreamer但没有mplayer,所以mplayer会继续运行。

通过在子进程上使用kill,你发送一个信号SIGKILL,除非子进程确实处理信号中断,否则它将快速关闭自己并且不会杀死自己的孩子,因此mplayer将存活(并且可能变成僵尸进程)。 p>

您没有引用您的子进程子'mplayer',但是如果您可以获得他的PID,您可以使用os.kill将其杀死(...)

os.kill(process_pid, signal.SIGTERM)

答案 1 :(得分:0)

使用os.system("killall -9 mplayer")是解决此问题的简便方法。介意使用此选项会杀死mplayer的所有进程,虽然这在我的情况下不是问题但可能是其他情况下的问题。

while True:
        proc1 = subprocess.Popen(cmd.split(), shell=False)
        time.sleep(600)
        os.system("killall -9 mplayer")
        proc1.kill()