You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Debian系统中SocketServer服务开机自启时触发OSError 99(无法分配请求地址)问题求助及解决记录

Debian系统中SocketServer服务开机自启时触发OSError 99(无法分配请求地址)问题求助及解决记录

我用Python的socketserver模块写了一个简单的TCP服务器,直接在bash里执行python scpi_server.py的时候,服务器运行完全正常,功能也没问题。

下面是简化后的核心代码:

if __name__ == "__main__":
    HOST, PORT = "10.121.1.36", 9999  # 监听公司DHCP分配给我的固定IP,端口9999
    server =  socketserver.TCPServer((HOST, PORT), ScpiRequestHandler)
    print(f"Server started on: {server.server_address}")
    server.serve_forever()  # 启动服务器

对应的请求处理类代码如下:

class ScpiRequestHandler(socketserver.BaseRequestHandler):
    def handle(self):
        while True:
            data = self.request.recv(1024).decode('utf-8')
            if not data:
                break
            for cmd in data.split(';'):
                try:
                    cmd = ScpiParser.parse(cmd)
                except TypeError:
                    # 解析失败则终止处理
                    return

                answer = BusHandler.apply(cmd)
                
                if answer is not None:
                    self.request.sendall(answer.encode('utf-8'))

如前所述,手动运行完全没问题,但我想让它开机自动启动,于是做了这些操作:

  • 在/etc/systemd/system/目录下创建了scpi_server.service文件
  • 给脚本添加执行权限:chmod +x /path/to/scpi_server.py
  • 重载systemd配置:sudo systemctl daemon-reload
  • 启用服务:sudo systemctl enable scpi_server.service

我的scpi_server.service文件内容是这样的:

[Unit]
Description=My Python Script
After=network.target
Wants=network.target

[Service]
ExecStart=/usr/bin/python3 /pathto/scpi_server.py
WorkingDirectory=/pathto/
User=root # 我平时登录的用户
StandardOutput=journal
StandardError=journal
Restart=always

[Install]
WantedBy=multi-user.target

现在遇到的问题是:如果我手动启动服务后,用systemctl status scpi_server.service查看,服务是正常运行的,但系统重启后,服务就起不来了。查看日志后发现,代码在执行server = socketserver.TCPServer((HOST, PORT), ScpiRequestHandler)这一行时抛出了错误:

Traceback (most recent call last):
File "/root/RaspIO_gpio_interf/scpi_server.py", line 61, in
server = socketserver.TCPServer((HOST, PORT), ScpiRequestHandler)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/socketserver.py", line 456, in init
self.server_bind()
File "/usr/lib/python3.11/socketserver.py", line 472, in server_bind
self.socket.bind(self.server_address)
OSError: [Errno 99] Cannot assign requested address

服务崩溃后会自动尝试重启,然后再次崩溃,陷入循环...

我的运行环境是Debian系统的树莓派4,IP地址是公司DHCP分配的固定地址(手动运行时这个IP是正常可用的),现在完全不知道该怎么解决这个问题,希望能得到大家的建议,谢谢!


后来解决了!感谢@JuliusB的帮助,只需要把service文件里的After=network.target和Wants=network.target改成After=network-online.target和Wants=network-online.target,现在服务器开机就能正常启动并运行了。

备注:内容来源于stack exchange,提问作者user30013477

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 19:44:31