後沒有公佈有: 答:程序,它擁有開放式插槽 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(...)
,但同樣的問題依然存在。
如果你顯示試圖打開套接字的代碼而不是一些完全不相關的腳本,它會更有用......作爲一個瘋狂的猜測,我會說你應該閱讀關於SO_REUSEADDR – PlasmaHH
在套接字創建中沒有SO_REUSEADDR。我想保持這種方式。爲什麼socket沒有發佈? –
有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); –