動態

詳情 返回 返回

藍易雲:Linux設置開機啓動 - 動態 詳情

Linux 設置開機自啓:一文掌握四種可靠方案 ⚙️

建議優先使用 <span style="color:red;">systemd</span>;其餘方法用於兼容或桌面場景。下文給出可直接落地的配置與排錯要點。

一、原理與場景對照表 📊

方式 觸發點 依賴控制 日誌與排錯 適用場景
<span style="color:red;">systemd system</span> 引導到 multi-user.target 強(After/Wants) journalctl 服務器/守護進程 ✅
<span style="color:red;">systemd user</span> 用户會話或 linger 中(PartOf/Wants) journalctl --user 無需 root、自啓工具
<span style="color:red;">cron @reboot</span> 內核引導後 弱(需自行等待) 重定向到文件 輕量腳本
<span style="color:red;">XDG Autostart</span> 桌面會話啓動 桌面環境日誌 GUI 程序

二、方法一:systemd(推薦,最穩)🚀

1)示例腳本 /usr/local/bin/myapp.sh

#!/usr/bin/env bash
set -euo pipefail
/usr/bin/env echo "myapp start at $(date)"
exec /usr/bin/python3 /opt/myapp/app.py

解釋

  • set -euo pipefail:異常即退出,避免僵進程。
  • exec:用目標進程替換 shell,便於 <span style="color:red;">systemd</span> 直接跟蹤與重啓。
  • 使用絕對路徑,防止 PATH 差異導致找不到命令。

2)Unit 文件 /etc/systemd/system/myapp.service

[Unit]
Description=My App Service
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
User=myapp
WorkingDirectory=/opt/myapp
ExecStart=/usr/local/bin/myapp.sh
Restart=on-failure
RestartSec=3
# 安全加固(可選)
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=full

[Install]
WantedBy=multi-user.target

解釋

  • After/Wants=network-online.target:等待網絡就緒;需要 systemd-networkd-wait-online 或發行版等價實現。
  • Restart=on-failure:崩潰自動拉起,減少人工介入。
  • WantedBy=multi-user.target:隨系統<span style="color:red;">開機自啓</span>。
  • 加固選項隔離文件系統與臨時目錄,提高安全性。

3)啓用與驗證

sudo systemctl daemon-reload
sudo systemctl enable --now myapp.service
sudo systemctl status myapp.service
sudo journalctl -u myapp -b

解釋

  • daemon-reload:讓 systemd 重新讀取新 Unit。
  • enable --now:立即啓動並加入開機項。
  • -b:僅看本次引導日誌,定位更快。

三、方法二:systemd(用户級,自啓或常駐)🧑‍💻

1)創建 Unit ~/.config/systemd/user/mytool.service

[Unit]
Description=User Tool

[Service]
ExecStart=/home/you/bin/tool --flag
Restart=on-failure

[Install]
WantedBy=default.target

解釋

  • 放在 <span style="color:red;">user</span> 作用域,無需 root。
  • WantedBy=default.target:隨用户會話啓動。

2)啓用(兩種形態)

systemctl --user daemon-reload
systemctl --user enable --now mytool.service      # 登錄後自啓
sudo loginctl enable-linger "$USER"               # 允許脱離登錄也常駐

解釋

  • enable-linger:機器重啓後即使未登錄,也能以 user 維持後台進程。

四、方法三:cron 的 @reboot(簡潔但依賴弱)⏰

crontab -e
@reboot /usr/local/bin/myapp.sh >>/var/log/myapp.log 2>&1

解釋

  • @reboot:系統引導後運行一次。
  • 務必使用絕對路徑,並自行處理“等待網絡/服務已就緒”(可在腳本里 sleep 5 或探測端口)。
  • 日誌重定向到文件,便於排錯。

五、方法四:rc.local(僅做兼容)🔧

# /etc/rc.local 末尾添加(確保可執行)
/usr/local/bin/myapp.sh &
exit 0

解釋

  • 一些發行版默認提供 rc-local.service;若不存在需手動創建等價 systemd 服務。
  • & 後台運行,避免阻塞引導;但依賴控制與日誌相對薄弱。

六、方法五:桌面環境自啓動(XDG Autostart)🖥️

# ~/.config/autostart/mygui.desktop
[Desktop Entry]
Type=Application
Name=MyGUI
Exec=/opt/mygui/start.sh
X-GNOME-Autostart-enabled=true

解釋

  • 僅在圖形會話登錄後啓動;不適用於純服務器。
  • Exec 同樣使用絕對路徑。

七、最小排錯清單 ✅

  • systemd-analyze verify /etc/systemd/system/myapp.service:靜態校驗 Unit。
  • journalctl -u myapp -b:看本次啓動日誌,聚焦問題根因。
  • 權限與路徑:確認 User= 能訪問 WorkingDirectory 與二進制。
  • 依賴未就緒:增加 After=/Wants=,或在腳本中檢測再啓動。
  • 反覆崩潰:查看返回碼,必要時暫時改 Restart=no 定位。

八、流程圖(vditor/Markdown 支持)🧭

flowchart LR
A[Boot] --> B[systemd 讀取 Units]
B --> C{WantedBy 目標達成?}
C -- yes --> D[啓動 Service: ExecStart]
D --> E{健康?}
E -- ok --> F[進入運行態]
E -- fail --> G[按 Restart 策略重試]
C -- no --> H[等待依賴/目標]

結論:生產環境優先 <span style="color:red;">systemd</span>,以 <span style="color:red;">After/Wants</span> 管控依賴、以 <span style="color:red;">Restart</span> 保持韌性、以 <span style="color:red;">journalctl</span> 精準排錯;其餘方法按需補充即可。需要整合 Docker、數據庫或網卡就緒等依賴時,可將它們聲明為目標或通過 ExecStartPre= 做健康探測,整體自啓會更穩。

user avatar nocobase 頭像 damenge 頭像 aerfazhe 頭像 someonelikeyou 頭像 liu_486 頭像 sishuiliunian_58f891c129ab1 頭像 pottercoding 頭像 feixiangdemojing 頭像 jianshendemifan 頭像 entropy_adding 頭像 lywlinux 頭像 huan1993 頭像
點贊 12 用戶, 點贊了這篇動態!
點贊

Add a new 評論

Some HTML is okay.