1

有: A:持有打开套接字的程序 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" );

升级.sh:

/sbin/service watchdog stop

.... install upgrade  .....

exec /sbin/service watchdog start &

升级成功执行,但是当程序启动时 - 无法打开套接字(已在使用中) - 出现此错误 - 程序退出(由看门狗重新启动)。

lsof -i 在端口上显示三个程序:

watchdog

program

sleep

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

看门狗 pid 持久。

我试图system(...)

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

4

1 回答 1

0

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

这必须在应用程序内部修复。需要设置SO_REUSEADDRsockopt。根据 socket(7) 的联机帮助页:

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

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

于 2012-12-13T16:36:00.250 回答