我已编写此监视程序脚本来监视VLC播放器并在播放停止时将其终止,因为VLC在播放后继续禁止电源管理守护程序。该脚本有效。我可以从命令行或通过IDLE运行它,并在播放停止时杀死VLC。我已经添加了许多变体命令来启动脚本到我的启动应用程序,如here所述,但是当我重新启动时,如果它正在运行,它会在VLC启动后立即停止。从终端重新启动它会使其保持运行并执行它应该执行的操作。我不知道这是脚本的问题还是Ubuntu Startup Applications特有的东西(尽管我倾向于Ubuntu)。也许与权限有关? (虽然我做了chmod +x
)在启动脚本之前,我是否应该执行其他命令以确保DBus已启动?我的一部分认为当脚本启动时没有完全加载某些内容所以我在使用* nix sleep
命令,python代码中的X-GNOME-Autostart-Delay
和time.sleep(n)
启动之前尝试睡眠。 pythonic方式似乎有最好的成功机会。 * nix方式似乎只会让启动需要更长的时间,并且在结束时我发现该进程甚至没有运行。我正在使用python-setproctitle
模块命名进程,以便我可以快速查看它是否与终端中的ps -e
一起运行。我没有想法,并准备在我重新启动时手动运行脚本(虽然原则上我认为机器应该为我做,因为我告诉它)。我尝试过的启动应用程序命令行的一些变体是:
/path/to/script/vlc_watchdog.py
"/path/to/script/vlc_watchdog.py"
/path/to/script/vlc_watchdog.py &
"/path/to/script/vlc_watchdog.py &"
python /path/to/script/vlc_watchdog.py
python /path/to/script/vlc_watchdog.py &
"python /path/to/script/vlc_watchdog.py"
"python /path/to/script/vlc_watchdog.py &"
bash -c "/path/to/script/vlc_watchdog.py"
sleep 30 ; /path/to/script/vlc_watchdog.py
sleep 30 && /path/to/script/vlc_watchdog.py
etc...
完整脚本:
#!/usr/bin/env python
import time
time.sleep(30)
import dbus
import os
import subprocess
from subprocess import Popen, PIPE
import daemon
import setproctitle
setproctitle.setproctitle('VLC-Watchdog')
sleeptime = 5
def vlc_killer():
bus = dbus.SessionBus()
vlc_media_player_obj = bus.get_object("org.mpris.MediaPlayer2.vlc", "/org/mpris/MediaPlayer2")
props_iface = dbus.Interface(vlc_media_player_obj, 'org.freedesktop.DBus.Properties')
pb_stat = props_iface.Get('org.mpris.MediaPlayer2.Player', 'PlaybackStatus')
if pb_stat == 'Stopped':
os.system("kill -9 $(pidof vlc)")
else:
time.sleep(sleeptime)
def vlc_is_running():
ps = subprocess.Popen(['ps', '-e'], stdout = PIPE)
out, err = ps.communicate()
for line in out.splitlines():
if 'vlc' in line:
return True
return False
def run():
while True:
if vlc_is_running():
vlc_killer()
else:
time.sleep(sleeptime)
with daemon.DaemonContext():
run()
答案 0 :(得分:1)
在启动Python代码的shell脚本(Ubuntu启动/初始化过程中的代码)中,使用如下内容:
#!/bin/sh
set -x
exec > /tmp/errors.out 2>&1
/path/to/script/vlc_watchdog.py
然后在事情再次出错之后(也就是说,在另一次重启之后),检查/tmp/errors.out以查看与发生的事情相关的错误消息。那里应该有一个Python回溯,或者至少有一个shell错误。