2015-11-01 46 views
0

我讀某些模式,如播放,暫停,停止等日誌文件..有條件終止推遲腳本

我只想執行某個腳本時,我讀到後面沒有一個STOP在接下來的5秒內播放。

這裏是我的代碼:

#!/bin/bash 
tail -Fn0 /tmp/player.log | \ 
while read line ; do 
    echo "$line" | grep -q "PLAYER STATE CHANGE: " 
    if [ $? = 0 ] 
    then 
     # If playing 
     echo "$line" | grep -q "PLAY" 
     if [ $? = 0 ] 
     then 
      echo "Started PLAYING!" 
      kill -INT $pid 
     fi 
     # If paused 
     echo "$line" | grep -q "PAUSE" 
     if [ $? = 0 ] 
     then 
      echo "PAUSED!" 
      defer_switch_off.sh & 
      pid=$! 
     fi 
     # If stopped 
     echo "$line" | grep -q "STOP" 
     if [ $? = 0 ] 
     then 
      echo "STOPPED!" 
      defer_switch_off.sh & 
      pid=$! 
     fi 
    fi 
done 

這是我的defer_switch_off.sh

#!/bin/bash 
trap 'kill -INT $pid' INT 
timeout 10 sh -c 'sleep 5; switch_off.sh' & 
pid=$! 
wait $pid 

我遇到的問題是,我不能夠killdeferred_switch_off.sh腳本時PLAY遵循STOP在我想要的5秒鐘的時間範圍內。腳本仍然執行。

+1

與你的問題沒有關係,但你可以用'=〜'字符串匹配bash運算符來簡化你的測試:if [[「$ line」=〜「PLAY」]]; then'。 –

+0

謝謝@RenaudPacalet。我不知道,會試一試。 – Zaxter

+0

我知道這不是你的問題,但是你應該把它作爲一個狀態機來實現,它有一個與時間檢查相關的特殊狀態(例如STOP_WAIT)。 –

回答

1

在您的腳本中,您需要檢查自從您每次在看到「停止」後看到PLAY後開始deferred_switch_off.sh多少時間過去了。

if [[ $line =~ PLAY ]]; then 
    if ((pid && SECONDS < 5)); then 
     kill -INT "$pid" 
     unset pid 
    fi 
elif [[ $line =~ STOP ]]; then 
    SECONDS=0 
    defer_switch_off.sh & 
    pid=$! 
elif ... 

SECONDS是遞增每個第二一個bash殼變量。


一種不同的方法是每次你看到停止時間記錄的時間戳,並檢查播放線的時間戳,如果pid不爲零。如果您沒有實時閱讀日誌,這可能會有所不同。

+0

謝謝!我會試試這個。 – Zaxter