为什么这个Python脚本不会在Ubuntu 12.04中作为启动应用程序运行?

时间:2014-01-18 21:45:57

标签: python ubuntu dbus

我已编写此监视程序脚本来监视VLC播放器并在播放停止时将其终止,因为VLC在播放后继续禁止电源管理守护程序。该脚本有效。我可以从命令行或通过IDLE运行它,并在播放停止时杀死VLC。我已经添加了许多变体命令来启动脚本到我的启动应用程序,如here所述,但是当我重新启动时,如果它正在运行,它会在VLC启动后立即停止。从终端重新启动它会使其保持运行并执行它应该执行的操作。我不知道这是脚本的问题还是Ubuntu Startup Applications特有的东西(尽管我倾向于Ubuntu)。也许与权限有关? (虽然我做了chmod +x)在启动脚本之前,我是否应该执行其他命令以确保DBus已启动?我的一部分认为当脚本启动时没有完全加载某些内容所以我在使用* nix sleep命令,python代码中的X-GNOME-Autostart-Delaytime.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()

1 个答案:

答案 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错误。