2025年12月10日 星期三

讓 gpio_redis_buffer.py 在背景持續運行

 要在 Raspberry Pi 上讓 gpio_redis_buffer.py 在背景持續運行,即使您登出 SSH 連線,最可靠和標準的方法有幾種。

以下我將介紹三種常見且實用的方法,並推薦使用 systemd,因為它是現代 Linux 系統(包括 Raspberry Pi OS)管理服務的標準方式,能確保程式在開機時自動啟動,並在崩潰時自動重啟。


🚀 方法一:使用 systemd 服務 (最推薦)

systemd 是 Linux 系統初始化和服務管理的工具。將您的 Python 腳本註冊為 systemd 服務,可以確保它:

  1. 開機自啟: 每次 Pi3 重啟後自動運行。

  2. 持續運行: 即使程式崩潰,systemd 也能嘗試重新啟動它。

  3. 背景運行: 獨立於您的使用者會話運行。

步驟 1: 建立服務檔案 (gpio_reader.service)

使用 sudo nano 建立一個名為 gpio_reader.service 的檔案,放在 /etc/systemd/system/ 目錄下:

Bash
sudo nano /etc/systemd/system/gpio_reader.service

將以下內容複製貼上。請務必根據您的實際情況修改 UserWorkingDirectoryExecStart 路径:

Ini, TOML
[Unit]
Description=GPIO to Redis Buffer Service
After=network.target redis.service

[Service]
# 執行使用者:建議使用非 root 用戶,例如預設的 'pi'
User=pi
# 設定工作目錄:您的 Python 檔案所在位置
WorkingDirectory=/home/pi/your_project_folder/ 
# 啟動指令:使用您的虛擬環境中的 python3 執行您的腳本
# 如果您使用了虛擬環境 (venv),請務必使用 venv 內部的 python3 路徑!
# 範例路徑: /home/pi/your_project_folder/venv/bin/python3
ExecStart=/home/pi/your_project_folder/venv/bin/python3 gpio_redis_buffer.py
# 程式崩潰後自動重啟
Restart=always
# 設定重啟延遲
RestartSec=10

[Install]
WantedBy=multi-user.target

(請將 /home/pi/your_project_folder/ 替換為您實際的專案路徑。)

步驟 2: 啟用並啟動服務

  1. 重新載入 systemd 配置:

    Bash
    sudo systemctl daemon-reload
    
  2. 啟用服務(設定開機自啟):

    Bash
    sudo systemctl enable gpio_reader.service
    
  3. 立即啟動服務:

    Bash
    sudo systemctl start gpio_reader.service
    

步驟 3: 檢查服務狀態與日誌

  • 檢查運行狀態:

    Bash
    sudo systemctl status gpio_reader.service
    

    您應該會看到 Active: active (running)

  • 查看日誌輸出:

    Bash
    sudo journalctl -u gpio_reader.service -f
    

    這會實時顯示您的 Python 程式(gpio_redis_buffer.py)的 print() 輸出,方便您確認程式是否正常讀取和寫入 Redis。


⚡ 方法二:使用 nohup (簡單快速,但功能較少)

nohup (No Hang Up) 可以在背景運行指令,並且防止程式在 SSH 連線斷開時終止。

Bash
# 確保您在專案目錄下
cd /home/pi/your_project_folder/ 

# 使用 nohup 執行腳本,並將輸出導向到 logfile.log
# 注意:這裡假設您已啟用虛擬環境或已全域安裝套件。
nohup python3 gpio_redis_buffer.py > logfile.log 2>&1 &

# 輸出範例:[1] 12345 (這是背景進程ID)
  • >:將標準輸出重新導向到 logfile.log

  • 2>&1:將標準錯誤輸出也導向到標準輸出(即 logfile.log)。

  • &:將整個命令在背景執行。

停止程式:

您需要找到進程 ID (PID) 並手動停止它:

  1. 查找 PID:

    Bash
    ps aux | grep gpio_redis_buffer.py
    # 找到類似 pi 12345 ... 的那一行,12345 就是 PID
    
  2. 停止進程:

    Bash
    kill 12345 
    

📦 方法三:使用 screentmux (適合除錯和手動操作)

screentmux 允許您建立一個虛擬終端會話,即使您斷開 SSH 連線,該會話也會保持運行。您可以隨時重新連接回來看程式的即時輸出。

使用 screen 步驟

  1. 安裝(如果未安裝):

    Bash
    sudo apt install screen
    
  2. 啟動一個新的 screen 會話:

    Bash
    screen -S gpio_session
    
  3. 在新的會話中執行程式:

    Bash
    python3 gpio_redis_buffer.py
    
  4. 分離會話(讓它在背景運行): 按下 Ctrl + A,然後按 D您現在可以安全地登出 SSH 了。

  5. 重新連線回會話:

    Bash
    screen -r gpio_session
    

總結: 對於長期可靠的背景服務,強烈建議使用 systemd

沒有留言:

張貼留言