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

如何停止树莓派开机自启的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服务,用系统命令直接启停,还能统一管理开机自启:

  1. 创建服务配置文件:sudo nano /etc/systemd/system/你的服务名.service
  2. 写入以下内容(替换成你的程序路径和信息):
[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
  1. 启用并启动服务:
sudo systemctl daemon-reload
sudo systemctl enable 你的服务名.service
sudo systemctl start 你的服务名.service
  1. 停止程序直接执行: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 14:45:22