【发布时间】:2014-10-23 11:27:26
【问题描述】:
我正在尝试制作一个启动程序 livestreamer(启动程序 mplayer)的 python 脚本,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 的命令。
【问题讨论】:
-
运行救生艇后,您可以运行另一个命令来获取救生艇的 pid。然后在 10 秒后您可以将其杀死。 :)
-
你的解决方案可以工作,但不是很灵活,我希望你的系统上没有其他东西会调用 mplayer 因为 killall 会杀死所有这些:)
-
是的,我理解,但这在我的情况下不是问题,但可能适用于其他情况。 :)
标签: python linux subprocess