如何停止树莓派开机自启的Python程序?求无终端停止方案
树莓派开机自启Python程序的可控停止方案
方法1:用PID发送SIGINT信号(模拟Ctrl+C)
- 先找到你的Python程序进程ID:运行
ps aux | grep 你的程序文件名.py,输出里第二列的数字就是PID - 发送和Ctrl+C一样的中断信号:执行
kill -SIGINT [PID],程序会触发KeyboardInterrupt异常,和手动按Ctrl+C效果完全一致,你可以在代码里捕获这个异常完成数据保存的收尾操作
方法2:给程序加自定义信号监听
在Python代码里加一段信号监听逻辑,让程序收到特定信号后优雅停止:
import signal import time def handle_stop(signum, frame): print("收到停止指令,开始保存数据...") # 这里写你的数据保存代码 exit(0) # 绑定SIGUSR1信号到处理函数,这个信号是用户自定义信号,不会和系统默认信号冲突 signal.signal(signal.SIGUSR1, handle_stop) # 你的主循环逻辑 while True: print("程序运行中") time.sleep(1)
停止时,先找到程序PID,然后执行kill -SIGUSR1 [PID],程序就会自动执行保存后退出
方法3:用systemd管理服务(最推荐)
把程序做成systemd服务,用系统命令直接启停,还能统一管理开机自启:
- 创建服务配置文件:
sudo nano /etc/systemd/system/你的服务名.service - 写入以下内容(替换成你的程序路径和信息):
[Unit] Description=自定义Python数据采集服务 After=multi-user.target [Service] User=pi ExecStart=/usr/bin/python3 /home/pi/你的程序文件.py Restart=no # 不需要自动重启就设为no KillSignal=SIGINT # 停止时发送SIGINT,和Ctrl+C效果一致 [Install] WantedBy=multi-user.target
- 启用并启动服务:
sudo systemctl daemon-reload sudo systemctl enable 你的服务名.service sudo systemctl start 你的服务名.service
- 停止程序直接执行:
sudo systemctl stop 你的服务名.service,系统会自动给程序发SIGINT信号,完美模拟Ctrl+C的停止效果
方法4:文件触发停止(适合无命令行基础的用户)
在程序里定期检查某个特定文件是否存在,存在就停止:
import os import time # 定义停止标记文件的路径 STOP_FLAG = "/home/pi/stop_my_program.txt" # 启动前先清除旧的标记文件 if os.path.exists(STOP_FLAG): os.remove(STOP_FLAG) while True: print("程序运行中...") # 检查标记文件 if os.path.exists(STOP_FLAG): print("检测到停止指令,保存数据后退出") # 这里写数据保存逻辑 os.remove(STOP_FLAG) exit(0) time.sleep(1)
要停止时,只需要执行touch /home/pi/stop_my_program.txt,程序检测到文件后就会自动保存并退出
内容的提问来源于stack exchange,提问作者Ytwo Monk
相关产品推荐
相关产品推荐

