为什么我的脚本从控制台启动时可以工作,但通过 upstart 启动时却不起作用?

为什么我的脚本从控制台启动时可以工作,但通过 upstart 启动时却不起作用?

我正在运行 Ubuntu 12.04。以下是我想做的事情:

我从这里复制并改编了一个 shell 脚本:http://yatse.leetzone.org/redmine/boards/2/topics/2088。它监听 UDP 端口 9 以获取 Wake-On-LAN 包。当它收到包时,它应该启动 xbmc。以下是脚本 /home/myusername/.xbmc/autostarter:

#!/bin/bash
UDP_PORT=9          # Change this if you need to run this on a different port

START_PHRASE="E.....@"    
START_PHRASE_ESCAPED="E\.\.\.\.\.@"    

# The following block checks if the user running this script has the required      privileges to listen on the port specified above
WHO=`whoami`
if [ "$WHO" != "root" ]; then
     echo "Cannot start unless running as root." >> /var/log/xbmc-starter.log
  exit 1
fi

echo "Listening on port $UDP_PORT for start command" >> /var/log/xbmc-starter.log

while [ true ]; do
     # Wait for a packet to come in
     LISTEN=`tcpdump "udp port $UDP_PORT" -A -c 1 2>&1 | grep -o    "$START_PHRASE_ESCAPED"`
     # Make sure that we received the right command
     if [ "$LISTEN" = "$START_PHRASE" ]; then
        echo "Starting XBMC" >> /var/log/xbmc-starter.log
        /usr/bin/xbmc 
        echo "test log after command" >> /var/log/xbmc-starter.log
     fi
     # Sleep, to be nice, for unwanted rogue processes writing to our port
     sleep 1
done

当我使用 sudo 从命令行运行此脚本并发送 WOL 包时,它可以运行并启动 xbmc。

sudo ./autostarter

日志输出为:

Listening on port 9 for start command
Starting XBMC
test log after command

但是当我从 upstart 脚本运行它时,它会创建相同的日志输出,但不会启动 xbmc。这是我的 upstart 脚本 xbmc-starter.conf:

# Starts a listener that runs the xbmc start script when a WOL package is received
description     "start xbmc wol listener script"
# runlevels
start on runlevel [2345]
stop on runlevel [!2345]
exec /home/myusername/.xbmc/autostarter

以及日志输出:

Listening on port 9 for start command
Starting XBMC
test log after command

为什么无法启动 XBMC?

答案1

也许添加env DISPLAY=:0到 Upstart 作业会有所帮助?我认为 XBMC 需要能够知道要使用什么显示器,你知道吗?

答案2

我会尝试一下,因为没有其他人提供答案。

尝试将您的启动条件更改为start on started tty1

我对 init 系统的理解是,如果您要求它们启动程序,它们会很乐意在奇怪的时间启动程序。要求在运行级别启动可能意味着在这些运行级别的开始处,在其他任何程序启动之前。比如在文件系统的任何部分被挂载之前,当然是在最小网络可用之前。

start on started tty1 将等到第一个终端启动后再启动程序,这基本上与您手动运行/测试程序的时间相同。因此,您的程序在引导过程中的较晚时间启动,但您应该会获得更一致的结果。

相关内容