2017-05-11 50 views
3

我有一個無限期運行的bash腳本。我已經搜索了高和低的解決方案,將定時事件添加到腳本中,每5分鐘觸發一次,而腳本的其餘部分則繼續運行。我不能讓腳本進入睡眠狀態,因爲它不斷向服務器發送/接收信息。有沒有人有任何功能或想法來實現這一點。基本上我希望它每300秒(5分鐘)發送一個特定的命令到服務器。我無法重寫服務器代碼以每5分鐘請求一次命令。Bash中的計時器事件

基本上主要的腳本是與此類似:

#!/bin/bash 

Var1="localhost" 
Var2="2356" 
Var3="DSDSASAQ" 
Var4= "Admin" 
#other variables as needed. 

function fun1(){ 
#do some stuff 
} 
function fun2(){ 
#do some stuff 
} 
function fun3(){ 
#do some stuff 
} 

#Main code section. 
exec 3<>/dev/tcp/${Var1}/${Var2} 
echo "login Var4 Var3" >&3 

While read LINE <&3; 
do 
#do some stuff 
done 
exit $? 

任何幫助表示讚賞。此外,我嘗試了像start = $ SECONDS和duration = $ SECONDS- $ start之類的東西,並在while循環中檢查if ... then語句,但它傾向於多次激發命令,然後重置啓動變量。服務器在檢測到垃圾郵件時也喜歡打破鏈接,所以在短時間內發送相同的命令10次以上並不理想。

+0

你想每300秒運行一次命令是什麼? (或)它是整個腳本? – Inian

+0

我只需要讓它每隔5分鐘回聲一次「活着」>&3 ......沒有什麼奇怪的......這將防止服務器斷開與腳本的連接 – user1305988

回答

1

我想你嘗試了錯誤,如果......然後條件。 這是我的注意事項......它應該只在需要的時間發送「特殊命令」一次。

#!/bin/bash 

# Set the "next time" when special command should be sent 
((start=SECONDS+300)) 

while read LINE <&3; do 
    echo "do some stuff" 

    # Did we reach the "next time" ... if yes 
    if ((SECONDS>=start)); then 
     echo "special command" 
     # And now set the new "next time" 
     ((start=SECONDS+300)) 
    fi 
done 
+0

這仍然有一些延遲問題,但似乎並未將服務器垃圾郵件,所以我可以處理一些延遲問題。延遲時間似乎要花費兩倍的時間才能開啓事件,但我可以彌補這一點。 – user1305988

0

有很多方法可以做到這一點,cronwatch,甚至while sleep,都想到了。

手錶

watch -n300 command 

而睡眠

while sleep 300; do command; done 

的cron

* * * * * sleep 300; command 

還有其他的方法,但其中一個se方法可能會適用於你的問題。

+0

我嘗試過在睡眠中觀看手錶,我在做。我需要整個腳本不停地運行。而這兩者基本上都使它進入了冬眠狀態。克朗不會爲此工作。 – user1305988

+0

嗯,那麼你應該使用上述方法之一的'screen',看到這個答案:http://stackoverflow.com/questions/36364505/bash-cron-flock-screen/36366663#36366663 –

3

在單獨的後臺進程中運行循環。

#!/bin/bash 

... 

#Main code section. 
exec 3<>/dev/tcp/${Var1}/${Var2} 

# watchdog 
while sleep 300 & wait; do 
    echo "login Var4 Var3" 
done >&3 & 
trap "kill $!" EXIT 

while read LINE <&3; 
do 
#do some stuff 
done 
exit $?