簡體   English   中英

為什么此Python腳本不能在Ubuntu 12.04中作為啟動應用程序運行?

[英]Why won't this Python script run as a startup application in Ubuntu 12.04?

我編寫了這個看門狗腳本來監視VLC播放器,並在播放停止時將其殺死,因為VLC在播放后繼續禁止電源管理守護程序。 該腳本有效。 我可以從命令行或通過IDLE運行它,並且在播放停止時它會殺死VLC。 我已經添加了許多命令的變體來啟動腳本,如此處所述但是當我重新啟動時,如果腳本完全在運行,則它將在VLC啟動后立即停止。 從終端重新啟動它會使其保持運行並執行應做的事情。 我不知道這是腳本問題還是Ubuntu啟動應用程序特有的問題(盡管我傾向於Ubuntu)。 也許與權限有關? (盡管我做了chmod +x )我是否應該在啟動腳本之前執行其他命令以確保DBus已啟動? 我的一部分認為腳本啟動時未完全加載某些內容,因此在使用* nix sleep命令, X-GNOME-Autostart-Delay和python代碼中的time.sleep(n) X-GNOME-Autostart-Delay之前,我嘗試了休眠。 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()

在啟動Python代碼的shell腳本(Ubuntu啟動/初始化過程中的腳本)中,使用類似以下內容的代碼:

#!/bin/sh

set -x
exec > /tmp/errors.out 2>&1
/path/to/script/vlc_watchdog.py

然后,在一切再次出現問題之后(也就是在重新啟動后),檢查/tmp/errors.out以查看與所發生的事情相關的錯誤消息。 那里應該有Python追溯,或者至少是一個shell錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM