2026年1月5日 星期一

樹莓派 (Pi 3) 開機時自動執行帶有 Python 虛擬環境 (venv) 的腳本

 要在樹莓派 (Pi 3) 開機時自動執行帶有 Python 虛擬環境 (venv) 的腳本,最推薦使用 systemd 服務(穩定可靠)或透過修改 autostart 檔案(適用於圖形界面登入後)來達成,重點在於確保腳本能激活虛擬環境 (source venv/bin/activate),再運行你的 Python 程式。 

方法一:使用 systemd (推薦,最穩健)
  1. 建立啟動腳本 (start_venv_app.sh):
    bash
    #!/bin/bash
    source /path/to/your/venv/bin/activate # 替換成你的 venv 路徑
    python3 /path/to/your/app.py # 替換成你的 Python 程式路徑
    deactivate # 可選,關閉 venv
    
    • 設定權限chmod +x start_venv_app.sh
  2. 建立 systemd 服務檔案 (例如 /lib/systemd/system/my-python-app.service):
    ini
    [Unit]
    Description=My Venv Python App
    After=network.target
    
    [Service]
    Type=simple
    ExecStart=/path/to/start_venv_app.sh # 替換成你的啟動腳本路徑
    WorkingDirectory=/path/to/your/app/folder # 程式執行目錄 (可選)
    Restart=always # 程式崩潰時自動重啟
    User=pi # 以 pi 帳號運行
    
    [Install]
    WantedBy=multi-user.target
    
  3. 啟動與設定開機啟動:
    bash
    sudo systemctl daemon-reload
    sudo systemctl enable my-python-app.service
    sudo systemctl start my-python-app.service
    
方法二:修改 LXDE-pi autostart (適用圖形界面登入後)
  1. 開啟 autostart 檔案:
    sudo nano /etc/xdg/lxsession/LXDE-pi/autostart.
  2. 加入啟動指令 (開啟終端機並執行):
    @lxterminal -e "/bin/bash -c 'source /path/to/your/venv/bin/activate && python3 /path/to/your/app.py'" .
    • 或者在同目錄下創建一個腳本文件(如 my_script.sh 包含 source ... && python3 ...)給它執行權限,然後 @lxterminal -e /path/to/my_script.sh. 
方法三:使用 cron (用於定時任務或用戶登入)
  • 使用者登入時執行 (crontab -e):
    @reboot /bin/bash -c 'source /path/to/your/venv/bin/activate && python3 /path/to/your/app.py'.
     
重要提示
  • 路徑:記得將所有 /path/to/... 替換為你實際的虛擬環境和 Python 程式路徑。
  • 權限:確保你的 Python 程式和腳本有執行權限 (chmod +x)。
  • venv激活source /path/to/venv/bin/activate 是關鍵,它會讓後續的 python3 指令使用虛擬環境中的 Python. 
要在 Raspberry Pi (Python 3) 實現開機自動於背景啟動程式,最推薦且符合 2026 年 Linux 標準的方法是使用 systemd
以下是設定步驟:
1. 建立服務設定檔
在系統服務目錄中建立一個 .service 檔案(例如 my_script.service):
bash
sudo nano /etc/systemd/system/my_script.service
請謹慎使用程式碼。
2. 寫入服務內容
將以下內容貼上,並修改 ExecStart 為你的 Python 路徑與檔案路徑:
ini
[Unit]
Description=My Python Script Service
After=multi-user.target

[Service]
# 指定執行使用者(通常是 pi)
User=pi
# 設定工作目錄
WorkingDirectory=/home/pi/your_folder
# 執行指令(請使用完整路徑)
ExecStart=/usr/bin/python3 /home/pi/your_folder/your_script.py
# 若程式崩潰自動重啟
Restart=always

[Install]
WantedBy=multi-user.target
請謹慎使用程式碼。
3. 啟動並啟用服務
執行以下指令讓系統載入新服務並設定開機啟動:
bash
# 重新載入設定
sudo systemctl daemon-reload

# 設定開機自動啟動
sudo systemctl enable my_script.service

# 立即啟動服務(測試用)
sudo systemctl start my_script.service
請謹慎使用程式碼。
4. 管理與除錯
  • 查看狀態: sudo systemctl status my_script.service
  • 停止服務: sudo systemctl stop my_script.service
  • 查看背景輸出日誌: journalctl -u my_script.service -f

其他替代方案
  • crontab (最簡單): 執行 crontab -e 並加入 @reboot python3 /path/to/script.py &。雖然簡單,但不如 systemd 穩定且難以管理日誌。
  • rc.local: 較舊的方法,在現代 Raspberry Pi OS 中已逐漸被 systemd 取代,不建議優先使用。
若需要更詳細的教學,可參考 Raspberry Pi 官方文件 (systemd)

Linux 開機時自動執行程式或指令

 在 Linux 開機時自動執行程式或指令,主要有幾種方法,最常見的是使用 Systemd 建立服務(現代主流)、修改 /etc/rc.local 檔案(傳統通用)、利用 cron 的 @reboot 指令,以及在 使用者登入時執行 ~/.bashrc / ~/.profile 或圖形化桌面環境的 XDG Autostart。選擇哪種方法取決於是在系統啟動時執行(Systemd 服務)、使用者登入時執行(XDG Autostart)或僅在特定使用者登入時執行(~/.bashrc)。 

1. 使用 Systemd 服務(推薦用於系統級任務)
這是現代 Linux 發行版(如 Ubuntu, CentOS 7+)管理服務和開機自啟動的標準方式。 
  1. 創建服務檔案:在 /etc/systemd/system/ 建立一個 .service 檔案,例如 my-app.service
  2. 內容
    [Unit]
    Description=My Application Service
    After=network.target # 依賴網絡,可根據需要調整
    
    [Service]
    ExecStart=/path/to/your/script.sh # 你的啟動指令或腳本
    Restart=always # 失敗時自動重啟
    
    [Install]
    WantedBy=multi-user.target # 系統多用戶模式啟動時執行
    
  3. 啟用服務
    bash
    sudo systemctl enable my-app.service # 開機自動啟動
    sudo systemctl start my-app.service  # 立即啟動
    
     
2. 修改 /etc/rc.local(傳統或簡單任務)
適用於舊版系統或只想在開機後期執行簡單指令。 
  1. 編輯檔案sudo nano /etc/rc.local
  2. 加入指令:在 exit 0 之前加入你的指令(使用絕對路徑),例如:
    bash
    /usr/local/bin/my-script.sh & # & 讓它在背景執行
    exit 0
    
  3. 確保可執行sudo chmod +x /etc/rc.local 
3. 使用 cron 的 @reboot
適合在每次重啟後簡單執行一個指令。 
  1. 編輯 crontabcrontab -e
  2. 加入指令
    @reboot /path/to/your/script.sh
    
     
4. 使用者登入時執行 (桌面環境)
  • For All Users (login shell):編輯 /etc/profile 或 /etc/profile.d/ 中的文件。
  • For Current User (login shell):編輯 ~/.bash_profile 或 ~/.profile
  • For Current User (open terminal):編輯 ~/.bashrc
  • Desktop Entry (GUI):在 ~/.config/autostart/ 放置 .desktop 檔案,用於啟動圖形化應用程式。 
執行權限
  • 所有腳本或程式都必須有執行權限,使用 chmod +x /path/to/script.sh
  • 在腳本中建議使用絕對路徑 
總結
  • Systemd:管理系統服務,最完整與現代。
  • rc.local:最簡單,但非標準化,適用於舊系統。
  • @reboot:適合快速重啟後執行一次性任務。
  • .bashrc / Autostart:針對特定使用者或圖形介面。