需求:在 Linux 系統啟動、用戶登入桌面環境後,自動執行特定 Shell 腳本啟動後台服務。本文區分「系統級開機」與「用戶級登入」兩種場景,提供標準做法與避坑指南。
| 場景 | 觸發時機 | 權限 | 典型用途 |
|---|---|---|---|
| 系統級開機 | 核心載入完成、進入 runlevel/target 前 | root | 系統服務、資料庫、網路配置 |
| 用戶級登入 | 用戶圖形介面/Shell 登入成功後 | 該用戶 | 桌面自啟應用、用戶級代理、開發環境啟動 |
遵循 Freedesktop Autostart Specification,建立 .desktop 檔案:
mkdir -p ~/.config/autostart
cat > ~/.config/autostart/myscript.desktop <<'EOF'
[Desktop Entry]
Type=Application
Exec=/home/user/scripts/startup.sh
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=MyStartupScript
Comment=Run user script after login
EOF
適用:GNOME、KDE、XFCE、MATE 等主流桌面。
編輯 ~/.bashrc 或 ~/.profile(登入 Shell 執行):
# ~/.bashrc 尾部新增
if [ -f ~/scripts/startup.sh ]; then
~/scripts/startup.sh &
fi
注意:.bashrc 互動式 Shell 每次開啟終端機都會跑,建議加守衛判斷或改用 .profile(僅登入一次)。
# ~/.config/systemd/user/myscript.service
[Unit]
Description=My User Startup Script
After=graphical-session.target
[Service]
Type=simple
ExecStart=/home/user/scripts/startup.sh
Restart=on-failure
[Install]
WantedBy=default.target
啟用:
systemctl --user daemon-reload
systemctl --user enable myscript.service
systemctl --user start myscript.service
優點:依賴管理、日誌整合、重啟策略、狀態查詢。
sudo cp startup.sh /etc/init.d/myscript
sudo chmod +x /etc/init.d/myscript
# SysVinit 風格
sudo update-rc.d myscript defaults # Debian/Ubuntu
sudo chkconfig --add myscript # CentOS/RHEL 6
# systemd 現代方式(推薦)
sudo cp myscript.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable myscript.service
#!/bin/bash 指定解釋器。export 所需變數,或 source /etc/profile。nohup cmd >/dev/null 2>&1 & 或 systemd 管理。>/var/log/myscript.log 2>&1,便於除錯。| 現象 | 原因 | 對策 |
|---|---|---|
| 腳本不執行 | 無執行權限、路徑錯誤、Shebang 缺失 | chmod +x、絕對路徑、加 Shebang |
| 環境變數缺失 | 非登入 Shell、cron 環境極簡 | 腳本內 source profile、設定完整 PATH |
| 圖形應用無法啟動 | 無 DISPLAY、Xauthority | systemd --user、設定 DISPLAY=:0、XAUTHORITY |