服务重启后未释放套接字

时间:2012-12-13 16:30:39

标签: c++ linux sockets service restart

有: 答:持有开放套接字的程序 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

程序和睡眠pids总是改变(即退出/重启行为)

看门狗pid持续。

我尝试用

替换system(...)

if(!fork()) exec(...),但同样的问题仍然存在。

1 个答案:

答案 0 :(得分:0)

根据关机后重启的速度,套接字会徘徊不前。默认情况下,Linux将套接字标记为已使用一段时间后(close()或进程终止),以确保传入的连接尝试或数据由于网络延迟而延迟不会以错误的申请结束。

必须在应用程序内修复此问题。需要设置SO_REUSEADDR sockopt。根据socket(7)的联机帮助页:

  

表示验证提供的地址时使用的规则   在bind(2)调用中应该允许重用本地地址。对于   AF_INET套接字这意味着套接字可以绑定,除非   有一个绑定到该地址的活动侦听套接字。什么时候   侦听套接字绑定到具有特定端口的INADDR_ANY   那么就不可能为任何本地绑定到这个端口   地址。 Argument是一个整数布尔标志。

必须在创建套接字后使用setsockopt设置。