我正在尝试创建一个启动程序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的命令。
答案 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()