2012-01-24 134 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

相關問題