下面给出了一个python脚本,用于侦听端口。在本例中,它是4995。我需要它始终运行并侦听连接,并将接收到的数据保存在文件中。
import socket
import threading
from datetime import datetime
import time
class Testing:
def __init__(self):
self.PORT = 4995
self.SERVER = ''
self.ADDR = (self.SERVER, self.PORT)
self.count = 0
def handle_client(self, conn, addr):
print(f'[{datetime.now().strftime("%H:%M")}][NEW CONNECTION] {addr} connected.')
s = time.time()
while True:
if time.time() - s > 300:
conn.close()
print(f'[{datetime.now().strftime("%H:%M")}][CLOSE CONNECTION] {addr} closed.')
break
try:
msg = conn.recv(2048).decode('utf-8')
except ConnectionResetError:
print(f'[{datetime.now().strftime("%H:%M")}][CLOSE CONNECTION] {addr} closed by peers.')
break
else:
if msg:
print(f'[{datetime.now().strftime("%H:%M")}] {msg}')
with open('msg.txt','a') as file:
file.write(msg)
s = time.time()
# conn.close()
def start(self):
self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.server.bind(self.ADDR)
self.server.listen()
print(f'[LISTENING] Server is listening on {self.SERVER}:{self.PORT}')
while True:
try:
self.conn, addr = self.server.accept()
except OSError:
return
thread = threading.Thread(target=self.handle_client, args=(self.conn, addr))
thread.start()
print(f'[{datetime.now().strftime("%H:%M")}][ACTIVE CONNECTIONS] {threading.active_count() - 1}')
if __name__ == '__main__':
Testing().start()
我试着运行上面的脚本,如
nohup python3 -u script.py &
它确实工作,但一段时间后,客户端自动无法与服务器建立连接,但脚本运行良好。经过一番研究,我发现nohup不是运行脚本的正确方式,因为它会根据Linux机器上的可用资源停止脚本。
我希望我的脚本总是在运行和监听连接。
大家好,我终于找到了我的问题的答案。我将代码作为服务而不是后台进程运行。以下步骤:-
步骤1:-在下面的路径中创建一个你想要的任意名称的服务。我创建的名称是app.service
sudo vim /etc/systemd/system/app.service
步骤2:-只需复制并粘贴下面的代码到你的服务文件中。修改"Description","User"one_answers"ExecStart"根据您的方便。
[Unit]
Description=my app desc
After=network.target
[Service]
User=root
# command to start the script
ExecStart= python3 /home/user/app.py
Restart=always
[Install]
WantedBy=multi-user.target
步骤3:-命令行systemctl start app
步骤4:-命令行systemctl enable app
当你修改你的代码时,不要忘记使用service app restart
重新启动你的服务。