點解每次重開機,啲服務都要手動拉起?
如果你管過一兩部 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


