systemd 服務自動重啟教學:令 Linux 服務開機自動啟動同崩潰自動拉起

點解每次重開機,啲服務都要手動拉起? 如果你管過一兩部 Linux server,一定遇過呢個情況:部機因為停電或者 kernel panic 重開咗,跟住 MySQL、Nginx、Redis 呢堆服務,有啲起得返、有啲起唔返,仲要逐個手動拉起。搞到你半夜三更仲要入去 check。 問題根源好簡單:你冇好好運用 systemd 嘅服務管理機制。今日就同你拆解點用 systemd 做服務自動啟動、自...

點解每次重開機,啲服務都要手動拉起?

如果你管過一兩部 Linux server,一定遇過呢個情況:部機因為停電或者 kernel panic 重開咗,跟住 MySQL、Nginx、Redis 呢堆服務,有啲起得返、有啲起唔返,仲要逐個手動拉起。搞到你半夜三更仲要入去 check。

👉 延伸閱讀:Linux Server 安全加固 6 步搞掂 — Defense in Depth 實戰指南

問題根源好簡單:你冇好好運用 systemd 嘅服務管理機制。今日就同你拆解點用 systemd 做服務自動啟動、自動重啟,等部機 reboot 之後乜都唔使理。

點解 systemd 先係正解?

而家主流 Linux 發行版(Ubuntu 16.04+、CentOS 7+、Debian 8+)預設都用 systemd 做 init 系統。佢唔單止係一個「開機啟動器」,仲係一個完整嘅 服務管理器——可以管依賴關係、自動重啟、資源限制、日誌收集。

以前用 init.d 腳本,服務死咗就真係死咗,冇人理你。systemd 可以幫你自動拉起,仲可以設定「死咗幾多次之後先放棄」,避免無限 loop。

第一步:寫一個 systemd unit file

假設你有個用 Python 寫嘅 API 服務,放喺 /opt/myapp/app.py。我哋幫佢寫一個 unit file,放喺 /etc/systemd/system/myapp.service:

[Unit]
Description=My Python API Service
After=network.target

[Service]
User=myapp
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/python3 /opt/myapp/app.py
Restart=always
RestartSec=3
Environment=PORT=8080

[Install]
WantedBy=multi-user.target

逐段解釋:

  • [Unit]:描述服務,After=network.target 意思係等網絡起好先開始。
  • [Service]:User 指定用邊個帳戶行(千祈唔好用 root)。ExecStart 就係實際執行嘅命令。
  • Restart=always:呢個係重點——服務無論點死,都會自動重啟。
  • RestartSec=3:死咗等 3 秒先重啟,避免太密。
  • [Install]:WantedBy=multi-user.target 令佢開機自動啟動。

第二步:啟用同管理服務

寫好之後,用呢幾條命令:

# 重新載入 systemd 配置
sudo systemctl daemon-reload

啟動服務

sudo systemctl start myapp

設定開機自動啟動

sudo systemctl enable myapp

睇狀態

sudo systemctl status myapp

enable 同 start 係兩回事:start 只係依家開始行,enable 先係開機自動啟動。好多人漏咗 enable,跟住 reboot 之後服務就冇咗。

第三步:進階自動重啟策略

單純 Restart=always 有時會造成「狂死狂起」嘅無限 loop。如果個服務因為 config 錯咗而不斷 crash,你就會見到 CPU 俾佢食晒。可以加多幾個參數:

[Service]
Restart=on-failure
RestartSec=5
StartLimitIntervalSec=300
StartLimitBurst=5
  • Restart=on-failure:只喺非零 exit code 時重啟(即係真正 crash 先重啟,正常退出唔理)。
  • StartLimitIntervalSec / StartLimitBurst:300 秒內最多重啟 5 次,超過就放棄,避免死 loop。

第四步:睇日誌,唔使再靠 print

systemd 會自動收集服務嘅 stdout/stderr 去 journal,用一條命令就睇到:

# 睇最近日誌
sudo journalctl -u myapp -n 50

即時跟住睇

sudo journalctl -u myapp -f

咁你個 Python 服務就算唔寫 log 檔,print 出嚟嘅嘢都會自動入咗 journal,方便 debug。

總結

🔗 參考資料:NVD NIST 漏洞資料庫

systemd 嘅核心價值就係一個字:穩。用 Restart=always + enable,你部機 reboot 之後服務自動起、死咗自動拉,再配合 journal 睇日誌,半夜就唔使再爬起身手動救火。呢套嘢係每個 Linux 管理員必備嘅基本功,值得你花半個鐘搞熟佢。

#IT教學 #server #技術分享 #Linux