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

树莓派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

排查与修复步骤

  1. 先查服务状态和日志
    用这两个命令定位具体错误:

    sudo systemctl status maxitest.service
    sudo journalctl -u maxitest.service -f
    
  2. 修正服务配置细节

    • 添加用户权限:脚本涉及蓝牙、音频设备,指定运行用户避免权限问题,在[Service]段加:
      User=maxi
      Group=maxi
      
    • 设置工作目录:确保脚本依赖的资源路径正确,[Service]段加:
      WorkingDirectory=/home/maxi/Desktop
      
    • 优化重启策略:如果只需要异常退出时重启,把Restart=always改成:
      Restart=on-failure
      RestartSec=5
      
      避免正常退出也触发重启,同时设置5秒间隔防止频繁重启。
  3. 补全依赖项
    脚本依赖蓝牙和音频服务,在[Unit]段添加依赖声明:

    Requires=bluetooth.service pulseaudio.service
    After=bluetooth.service pulseaudio.service
    
  4. 重新加载配置并启动服务

    sudo systemctl daemon-reload
    sudo systemctl enable maxitest.service
    sudo systemctl start maxitest.service
    
  5. 优化脚本鲁棒性
    原脚本收到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:40:46