问题 运行 tcp 服务器通过 systemd 服务获取已在使用的地址
Problem running tcp server via systemd service getting address already in use
我正在尝试 运行 SocketServer.TCPServer
昨天半夜我放代码审核
https://codereview.stackexchange.com/q/232879/22943、
但是我无法让 TCPServer
与 Systemd
一起工作,现在今天我终于指出了整个问题出在 运行 正在查看 [= 的 TCPServer 16=]日志。
Nov 24 13:33:06 rockpro64 systemd[1393]: Started TCP Server to recieve data from Particle Photon to upload to MySql
Nov 24 13:33:06 rockpro64 python3[1733]: inside main module.
Nov 24 13:33:06 rockpro64 python3[1733]: Traceback (most recent call last):
Nov 24 13:33:06 rockpro64 python3[1733]: File "/usr/local/iot/home_iot/tcpserver.py", line 92, in <module>
Nov 24 13:33:06 rockpro64 python3[1733]: main()
Nov 24 13:33:06 rockpro64 python3[1733]: File "/usr/local/iot/home_iot/tcpserver.py", line 83, in main
Nov 24 13:33:06 rockpro64 python3[1733]: server = Server(server_address, ParticlePhotonRequestHandler)
Nov 24 13:33:06 rockpro64 python3[1733]: File "/usr/local/iot/home_iot/tcpserver.py", line 58, in __init__
Nov 24 13:33:06 rockpro64 python3[1733]: TCPServer.__init__(self, server_address, handler_cls, bind_and_activat
Nov 24 13:33:06 rockpro64 python3[1733]: File "/usr/lib/python3.6/socketserver.py", line 456, in __init__
Nov 24 13:33:06 rockpro64 python3[1733]: self.server_bind()
Nov 24 13:33:06 rockpro64 python3[1733]: File "/usr/lib/python3.6/socketserver.py", line 470, in server_bind
Nov 24 13:33:06 rockpro64 python3[1733]: self.socket.bind(self.server_address)
Nov 24 13:33:06 rockpro64 python3[1733]: OSError: [Errno 98] Address already in use
Nov 24 13:33:06 rockpro64 systemd[1393]: photon_uploader.service: Main process exited, code=exited, status=1/FAILUR
Nov 24 13:33:06 rockpro64 systemd[1393]: photon_uploader.service: Failed with result 'exit-code'.
从我的服务单位,我已经摆脱了socket并做了一个简化版本:
[Unit]
Description=TCP Server to recieve data from Particle Photon to upload to MySql.
After=multi-user.target
Wants=network-online.target
After=network-online.target
[Service]
Type=idle
RestartSec=6
EnvironmentFile=/home/rock64/.config/systemd/user/photon_uploader.env
ExecStart=/usr/bin/python3 /usr/local/iot/home_iot/tcpserver.py
[Install]
WantedBy=multi-user.target
我仍然遇到同样的错误Address Already in use
地址已被使用主要有两个原因:
该地址实际上正被另一个 运行 进程使用。您可以通过 运行 netstat -pnutl
检查
该地址已被同一进程先前进行的绑定尝试使用,没有时间正确关闭。通过打开套接字选项 SO_REUSEADDR
有一个简单的解决方案:
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
我正在尝试 运行 SocketServer.TCPServer
昨天半夜我放代码审核
https://codereview.stackexchange.com/q/232879/22943、
但是我无法让 TCPServer
与 Systemd
一起工作,现在今天我终于指出了整个问题出在 运行 正在查看 [= 的 TCPServer 16=]日志。
Nov 24 13:33:06 rockpro64 systemd[1393]: Started TCP Server to recieve data from Particle Photon to upload to MySql
Nov 24 13:33:06 rockpro64 python3[1733]: inside main module.
Nov 24 13:33:06 rockpro64 python3[1733]: Traceback (most recent call last):
Nov 24 13:33:06 rockpro64 python3[1733]: File "/usr/local/iot/home_iot/tcpserver.py", line 92, in <module>
Nov 24 13:33:06 rockpro64 python3[1733]: main()
Nov 24 13:33:06 rockpro64 python3[1733]: File "/usr/local/iot/home_iot/tcpserver.py", line 83, in main
Nov 24 13:33:06 rockpro64 python3[1733]: server = Server(server_address, ParticlePhotonRequestHandler)
Nov 24 13:33:06 rockpro64 python3[1733]: File "/usr/local/iot/home_iot/tcpserver.py", line 58, in __init__
Nov 24 13:33:06 rockpro64 python3[1733]: TCPServer.__init__(self, server_address, handler_cls, bind_and_activat
Nov 24 13:33:06 rockpro64 python3[1733]: File "/usr/lib/python3.6/socketserver.py", line 456, in __init__
Nov 24 13:33:06 rockpro64 python3[1733]: self.server_bind()
Nov 24 13:33:06 rockpro64 python3[1733]: File "/usr/lib/python3.6/socketserver.py", line 470, in server_bind
Nov 24 13:33:06 rockpro64 python3[1733]: self.socket.bind(self.server_address)
Nov 24 13:33:06 rockpro64 python3[1733]: OSError: [Errno 98] Address already in use
Nov 24 13:33:06 rockpro64 systemd[1393]: photon_uploader.service: Main process exited, code=exited, status=1/FAILUR
Nov 24 13:33:06 rockpro64 systemd[1393]: photon_uploader.service: Failed with result 'exit-code'.
从我的服务单位,我已经摆脱了socket并做了一个简化版本:
[Unit]
Description=TCP Server to recieve data from Particle Photon to upload to MySql.
After=multi-user.target
Wants=network-online.target
After=network-online.target
[Service]
Type=idle
RestartSec=6
EnvironmentFile=/home/rock64/.config/systemd/user/photon_uploader.env
ExecStart=/usr/bin/python3 /usr/local/iot/home_iot/tcpserver.py
[Install]
WantedBy=multi-user.target
我仍然遇到同样的错误Address Already in use
地址已被使用主要有两个原因:
该地址实际上正被另一个 运行 进程使用。您可以通过 运行
netstat -pnutl
检查
该地址已被同一进程先前进行的绑定尝试使用,没有时间正确关闭。通过打开套接字选项
SO_REUSEADDR
有一个简单的解决方案:s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)