2012-08-10 62 views
52

如何在等待Web服務器響應的bash中創建一個循環?如何在等待Web服務器響應的bash中創建一個循環?

它應該打印一個「。」每10秒鐘左右一次,然後等到服務器開始響應。

更新,此代碼測試如果我從服務器得到良好的響應。

 
if curl --output /dev/null --silent --head --fail "$url"; then 
    echo "URL exists: $url" 
else 
    echo "URL does not exist: $url" 
fi 
+0

您能更具體地瞭解您如何等待服務器響應嗎? – chepner 2012-08-10 15:33:34

+0

我會認爲服務器還沒有準備好,只要它沒有回覆,或者回復的內容與200響應不同。 – sorin 2012-09-06 13:51:32

回答

85

相結合的chepner的回答這個問題,這個工作對我來說:

until $(curl --output /dev/null --silent --head --fail http://myhost:myport); do 
    printf '.' 
    sleep 5 
done 
+5

反引號''的使用[已過時](http://unix.stackexchange.com/a/5782/39845)。改用'$()'。 – 2014-04-18 15:37:47

+2

在放棄之前允許最長的等待時間將是一個很好的擴展 – tkruse 2016-03-17 15:20:35

+0

爲什麼你需要' - head'? – lexicore 2017-02-03 13:10:03

-1

如果你需要檢查服務器是否可用,原因是在重新啓動或別的東西,你可以嘗試做一個wget的服務器和解析響應或錯誤,如果你得到一個200,甚至是404服務器已啓動,您可以使用--timeout = seconds更改wget超時,您可以將超時設置爲10秒並進行循環,直到響應中的grep結果爲止。

我不知道這是你正在尋找或真的需要bash代碼。

0

有趣的謎題。如果你與你的客戶沒有訪問或異步API,你可以嘗試grepping你的TCP套接字是這樣的:

until grep '***IPV4 ADDRESS OF SERVER IN REVERSE HEX***' /proc/net/tcp 
do 
    printf '.' 
    sleep 1 
done 

但是,這是一個忙等待1秒的間隔。您可能需要比這更多的分辨率。這也是全球性的。如果與該服務器建立了另一個連接,則結果無效。

0

使用反引號` `的是outdated。改爲使用$()

until $(curl --output /dev/null --silent --head --fail http://myhost:myport); do 
    printf '.' 
    sleep 5 
done 
5

httping對此很好。簡單,乾淨,安靜。

while ! httping -qc1 http://myhost:myport ; do sleep 1 ; done 

while/until etc is a personal pref。

+0

再想一想,永遠是一段很長的時間...'因爲我在'seq 60'; do httping -qc1 http:// myhost:myport && echo && break sleep 5 echo -n $ {i} .. 完成 ' – 2015-04-03 17:22:23

0

wait-on是一個跨平臺的命令行工具和Node.js的API,它會等待文件,港口,插座,和HTTP(S)資源變爲可用:https://github.com/jeffbski/wait-on

例如,等待:8080 5s,如果成功則執行NEXT_CMD。

wait-on -t 5000 http-get://localhost:8080/foo && NEXT_CMD