2012-12-13 36 views
1

後沒有公佈有: 答:程序,它擁有開放式插槽 B:看門狗腳本作爲服務運行:插座服務重新啓動

while true 
do 
     if [ -z "`pidofproc $1`" ]; then 
       $1; 
      chrt -f -p 40 `pidofproc $1` 
       sleep 8 
     fi; 
     sleep 2 
done 

當服務啓動 - 看門狗開始
當服務停止 - 看門狗和程序被殺死(killall)。

現在程序要升級自己,所以它調用system("upgrade.sh");

upgrade.sh:

/sbin/service watchdog stop 

.... install upgrade ..... 

exec /sbin/service watchdog start & 

升級順利進行,但程序啓動時 - 無法打開插座(已在使用) - 在這個錯誤 - 程序退出(由看門狗重新啓動)。

lsof的-i顯示端口上的三個方案:

watchdog 

program 

sleep 

程序和睡眠的PID隨時改變(即退出/重啓行爲)

看門狗PID持續性。

我試圖取代system(...),與

if(!fork()) exec(...),但同樣的問題依然存在。

+1

如果你顯示試圖打開套接字的代碼而不是一些完全不相關的腳本,它會更有用......作爲一個瘋狂的猜測,我會說你應該閱讀關於SO_REUSEADDR – PlasmaHH

+0

在套接字創建中沒有SO_REUSEADDR。我想保持這種方式。爲什麼socket沒有發佈? –

+0

有acceptor_.set_option(boost :: asio :: ip :: tcp :: acceptor :: reuse_address(true),ec); \t acceptor_.set_option(boost :: asio :: ip :: tcp :: no_delay(true),ec); \t acceptor_。set_option(boost :: asio :: socket_base :: linger(true,200),ec); –

回答

0

根據關閉後重新啓動的速度有多快,套接字會一直徘徊。在默認情況下,Linux在被釋放後會將標記爲已使用一段時間(通過close()或進程死亡後)保持標記爲已使用一段時間,以確保傳入連接嘗試或由於網絡延遲而延遲的數據不會結束在錯誤的應用程序中。

這必須在應用程序內部修復。需要設置SO_REUSEADDR sockopt。根據套接字(7)的聯機幫助頁:

指示在bind(2)調用中提供的驗證地址所使用的規則應允許重用本地地址。對於 AF_INET套接字,這意味着一個套接字可以綁定,除非當有一個活動的監聽套接字綁定到該地址時 。當 監聽套接字與特定端口 綁定到INADDR_ANY時,則不可能爲任何本地 地址綁定到此端口。參數是一個整數布爾標誌。

創建套接字後,必須使用setsockopt進行設置。

+1

所以如果我不想使用SO_REUSEADDR,我應該在升級腳本中添加睡眠60 –