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

