树莓派Python脚本自启动与异常自动重启方案求助
Python脚本异常退出自动重启方案(systemd配置失败排查)
我原本以为自己掌握了Python脚本自启动的方法,但现在需要一种能在脚本停止运行时自动重启的方案。尝试配置成systemd服务却没成功,以下是我的Python代码和对应的systemd服务配置文件:
Python代码
import bluetooth import pygame pygame.mixer.init() server_sock=bluetooth.BluetoothSocket( bluetooth.RFCOMM ) port = 22 server_sock.bind(("",port)) server_sock.listen(1) client_sock,address = server_sock.accept() print ("连接已建立: ", address) while True: recvdata = client_sock.recv(1024) print ("收到消息: %s" % recvdata) pygame.mixer.pause() if (recvdata == b"h"): sound = pygame.mixer.Sound('/home/maxi/Desktop/test.wav') playing = sound.play() if (recvdata == b"p"): sound = pygame.mixer.Sound('/home/maxi/Desktop/test2.wav') playing = sound.play() if (recvdata == b"k"): break client_sock.close() server_sock.close()
systemd服务配置文件
[Unit] Description=MaxiTest After=multi-user.target [Service] Type=simple Restart=always ExecStart=/usr/bin/python3 /home/maxi/Desktop/btsound1.py [Install] WantedBy=multi-user.target
排查与修复步骤
先查服务状态和日志
用这两个命令定位具体错误:sudo systemctl status maxitest.service sudo journalctl -u maxitest.service -f修正服务配置细节
- 添加用户权限:脚本涉及蓝牙、音频设备,指定运行用户避免权限问题,在
[Service]段加:User=maxi Group=maxi - 设置工作目录:确保脚本依赖的资源路径正确,
[Service]段加:WorkingDirectory=/home/maxi/Desktop - 优化重启策略:如果只需要异常退出时重启,把
Restart=always改成:
避免正常退出也触发重启,同时设置5秒间隔防止频繁重启。Restart=on-failure RestartSec=5
- 添加用户权限:脚本涉及蓝牙、音频设备,指定运行用户避免权限问题,在
补全依赖项
脚本依赖蓝牙和音频服务,在[Unit]段添加依赖声明:Requires=bluetooth.service pulseaudio.service After=bluetooth.service pulseaudio.service重新加载配置并启动服务
sudo systemctl daemon-reload sudo systemctl enable maxitest.service sudo systemctl start maxitest.service优化脚本鲁棒性
原脚本收到k指令会主动退出(属于正常终止,systemd默认不重启),如果希望这种情况也重启,要么把Restart改回always,要么给脚本加一层循环:import bluetooth import pygame import time def run_server(): pygame.mixer.init() server_sock=bluetooth.BluetoothSocket( bluetooth.RFCOMM ) port = 22 try: server_sock.bind(("",port)) server_sock.listen(1) print("等待蓝牙连接...") client_sock,address = server_sock.accept() print ("连接已建立: ", address) while True: try: recvdata = client_sock.recv(1024) if not recvdata: print("客户端断开") break print ("收到消息: %s" % recvdata) pygame.mixer.pause() if recvdata == b"h": sound = pygame.mixer.Sound('/home/maxi/Desktop/test.wav') sound.play() elif recvdata == b"p": sound = pygame.mixer.Sound('/home/maxi/Desktop/test2.wav') sound.play() elif recvdata == b"k": print("收到退出指令,准备重启") break except Exception as e: print(f"接收消息出错: {e}") break except Exception as e: print(f"启动失败: {e}") finally: try: client_sock.close() except: pass server_sock.close() if __name__ == "__main__": while True: run_server() time.sleep(3)
内容的提问来源于stack exchange,提问作者Ponda
相关产品推荐
相关产品推荐

