2014-01-27 74 views
2

在Ubuntu 12.04服務器上,我有一個bash腳本來優雅地停止我的apache2服務器,刪除/var/www的內容,解壓縮新內容並再次啓動apache。Bash腳本:等待apache2 graceful-stop

Test 
Flush... 
Flushed. 
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80 
no listening sockets available, shutting down 
Unable to open logs 
Action 'start' failed. 
The Apache error log may have more information. 

所以腳本不會等待阿帕奇停止:當Apache重新開始(一切以root執行)

echo "Test"; 
cd /var; 
service apache2 graceful-stop; 
rm -R www/ && echo "Flush..."; 
unzip transfer.zip > /dev/null && echo "Flushed."; 
service apache2 start; 

我得到的錯誤是。

這裏是我試過到目前爲止:(同樣的錯誤)

我試圖等待與wait

service apache2 graceful-stop; 
wait $!; 

我試圖讓Apache的PID和等待這一個(同樣的錯誤)

pid=$(cat /var/run/apache2.pid) 
apache2ctl graceful-stop; 
wait $pid; 

我試圖用apache2ctl graceful-stop代替service apache2 graceful-stop(同樣的錯誤)


我錯過了什麼?當我使用 service apache2 stop,一切工作正常:

* Stopping web server apache2                       
... waiting                         [ OK ] 
Flush... 
Flushed. 
* Starting web server apache2                    [ OK ] 

感謝

編輯

這裏與等待的退出代碼的輸出:

* Stopping web server apache2                    [ OK ] 
0 
Flush... 
Flushed. 
* Starting web server apache2                      
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80 
no listening sockets available, shutting down 
Unable to open logs 
Action 'start' failed. 
The Apache error log may have more information. 
                               [fail] 
+0

是什麼等待的退出狀態? –

+0

退出代碼爲'0' ... –

+0

輸出不正確。更新我的問題。 –

回答

1

看來,阿帕奇本身建議等待重啓之間的幾秒鐘: http://wiki.apache.org/httpd/CouldNotBindToAddress

實際上,釋放和綁定到端口並不是立即就會比較常見。內核釋放關閉的套接字可能需要一些時間(最長達幾分鐘)。它被稱爲靈兒時間。這也是由一些Apache文檔簡要討論的,請參閱http://httpd.apache.org/docs/2.2/misc/perf-tuning.html搜索「延遲關閉」。

有一個關於這個問題有很詳細的回答了這個問題:Socket options SO_REUSEADDR and SO_REUSEPORT, how do they differ? Do they mean the same across all major operating systems?

+0

首先,謝謝!任何想法爲什麼'apache2停止'工作?如果你是對的,它不應該爲'stop'工作,如果它? –

+0

是的,它也不應該由這個理論工作。我們必須比較腳本,不幸的是我不知道細節。 –

+1

非常感謝你,使用'sleep 1;'工作,所以你的回答是正確的。 –