2012-01-24 103 views
1

我有一个bash脚本,我通过cron运行重新启动vlc(我使用vlc显示来自IP摄像头的流作为婴儿监视器使用 - 流得到逐步延迟,所以我运行这个脚本来杀死vlc的所有实例并重新启动它)。这个脚本在Ubuntu 11.04中运行良好一年。我升级到Ubuntu 11.10(哦,傻我),现在只有在打开bash调试选项(bash -x script.sh)的情况下运行它才能正常工作。如果我运行它没有-x选项,脚本成功杀死了vlc的所有实例,但是然后退出并且无法重启vlc.I我不知道为什么。请注意,如果我通过或cron运行它,或者直接在命令行上运行它,没有-x选项,那么它会杀死vlc但从不运行vlc。Bash脚本在调试时运行(-x)但运行正常时失败

这就是:

#!/bin/bash 
DISPLAY=:0 
export DISPLAY 

VPID=($(ps -e | grep vlc | awk '{print $1;}')) 
if [ -n "$VPID" ];then 
     while [ -n "$VPID" ];do 
      kill $VPID 
      VPID=($(ps -e | grep vlc | awk '{print $1;}')) 

     done 
     vlc --volume=900 http://lily:@192.168.1.43/videostream.asf & 
     sleep 10 
     WID=($(xwininfo -display :0 -name "http://192.168.1.43/videostream.asf - VLC media player" -int | awk '/Window id:/ {print $4}')) 
     sleep 10 
     xdotool windowmove --sync $WID 0 0 
     xdotool windowsize --sync $WID 1600 1000 
     exit 
fi 
exit 
+1

'pkill的vlc'比你目前的杀害所有VLC工艺方法简单得多。 –

+0

谢谢,我会给它一个 - 我总是倾向于使用锤子来破解一个坚果;) – prupert

回答

1
  1. 你为什么做VPIDWID阵列?
  2. 你有没有试过把echo "after while loop"直接放在done之后的while循环中,看看你的脚本是否在调试模式下跳出而不是
  3. 没有必要明确exit脚本编写

请尝试以下方式:

#!/bin/bash 
export DISPLAY=":0" 

VPID=$(pgrep vlc) 
if [[ -n "$VPID" ]]; then 
    while [[ -n "$VPID" ]]; do 
    kill $VPID 
    VPID=$(pgrep vlc) 
    done 

    vlc --volume=900 http://lily:@192.168.1.43/videostream.asf & 
    sleep 10 
    WID=$(xwininfo -display :0 -name "http://192.168.1.43/videostream.asf - VLC media player" -int | awk '/Window id:/ {print $4}') 
    sleep 10 
    xdotool windowmove --sync "$WID" 0 0 
    xdotool windowsize --sync "$WID" 1600 1000 
fi 
+0

对不起,延迟响应,我认为stackoverflow通过电子邮件与您的答复。 VPID是获得vlc的PID,但似乎有更好的方法来获得这个,所以谢谢。 WID只是指定创建的vlc窗口名称的一种更简单的方法。我会尝试你的建议,看看我能得到多少。谢谢。 – prupert

相关问题