目錄
- 基礎與背景
- 服務管理范圍
- 配置文件和管理方式
- 監控與日志
- 依賴管理
- 適用場景
- 常用命令對照表
- 實際應用場景舉例
- 優缺點對比小結
- 參考鏈接
1. 基礎與背景
systemctl 和 supervisord 都是用于管理和控制服務(進程)的工具,但它們在設計、使用場景和功能上有所不同。以下是它們之間的主要區別:
- systemctl:
- systemctl 是 systemd 的一部分,systemd 是 Linux 系統中的系統和服務管理器,負責在系統啟動時管理系統進程、掛載文件系統、處理網絡配置等。
- systemctl 通過管理 systemd 單元(unit files)來控制系統服務。
- systemctl 通常是現代 Linux 發行版中的默認服務管理工具(如 CentOS 7+, Ubuntu 15.04+)。
- supervisord:
- supervisord 是一個進程管理工具,專門用于監控和管理獨立的后臺進程。
- 它是 Python 編寫的,并且被設計用于跨平臺運行,主要用于啟動、監控、重啟應用程序。
- supervisor 最早主要用于開發環境和特定服務的進程管理,通常不管理系統服務。
2. 服務管理范圍
- systemctl(systemd):
- 負責管理所有系統服務,包括啟動、停止、重啟、啟用(開機啟動)和禁用服務。
- 可以管理系統級別的服務,比如網絡服務、守護進程等。
- 更側重于系統啟動時的服務管理,并且可以管理定時任務(通過 timers)、設備掛載、網絡配置等。
- supervisord:
- 主要用于管理用戶定義的應用進程,例如應用程序、后臺任務、Web服務等。
- 適合多進程的應用程序或需要長期運行的任務的監控和管理。
- supervisor 可以定期監控和重啟由于異常退出的進程。
3. 配置文件和管理方式
- systemctl:
- 使用 unit files,它們位于 /etc/systemd/system/ 或 /lib/systemd/system/ 目錄下。這些文件通常以 .service、.target、.mount、.timer 等后綴結尾。
- 配置文件格式相對固定,基于 INI 風格,包含 [Unit]、[Service]、[Install] 等配置段。
- 常見命令:
- systemctl start/stop/restart :啟動/停止/重啟服務。
- systemctl enable/disable :啟用/禁用服務開機啟動。
systemctl(systemd)配置文件示例
示例1:簡單的自定義服務
[Unit]
Description=My Simple Service
After=network.target[Service]
ExecStart=/usr/bin/python3 /opt/myscript.py
Restart=on-failure[Install]
WantedBy=multi-user.target
說明:此配置定義了一個在網絡服務啟動后運行的 Python 腳本服務,異常退出時自動重啟。
示例2:帶環境變量和工作目錄的服務
[Unit]
Description=Node.js Web App[Service]
WorkingDirectory=/opt/webapp
ExecStart=/usr/bin/node server.js
Environment=NODE_ENV=production PORT=8080
Restart=always[Install]
WantedBy=multi-user.target
說明:此配置用于 Node.js Web 應用,指定了工作目錄和環境變量,并設置為始終重啟。
- supervisord:
- 使用獨立的配置文件,通常位于 /etc/supervisor/supervisord.conf 或類似目錄中。
- 進程定義在 [program:x] 區塊中,指定每個進程的啟動命令、環境變量、日志、重啟策略等。
- 常見命令:
- supervisorctl start/stop :啟動/停止某個進程。
- supervisorctl reread/update:重新讀取配置文件并應用更改。
supervisord 配置文件示例
示例1:管理單個 Python 進程
[program:myworker]
command=python3 /opt/worker.py
autostart=true
autorestart=true
stderr_logfile=/var/log/myworker.err.log
stdout_logfile=/var/log/myworker.out.log
說明:此配置定義了一個自動啟動和自動重啟的 Python worker 進程,并分別記錄標準輸出和錯誤日志。
示例2:管理 Node.js 服務并設置環境變量
[program:webapp]
command=node /opt/webapp/server.js
directory=/opt/webapp
autostart=true
autorestart=true
environment=NODE_ENV="production",PORT="8080"
stdout_logfile=/var/log/webapp.log
stderr_logfile=/var/log/webapp.err.log
說明:此配置用于 Node.js 服務,指定了工作目錄和環境變量,并配置了日志輸出。
supervisord 可視化界面(Web UI)配置示例
Supervisor 自帶一個簡單的 Web 管理界面,可以通過配置 [inet_http_server] 實現。該界面支持進程的啟動、停止、重啟、日志查看等操作。
示例:啟用 Web 管理界面
[inet_http_server]
port=0.0.0.0:9001 ; 監聽所有網卡的 9001 端口
username=admin ; 登錄用戶名
password=123456 ; 登錄密碼
說明:此配置啟用了 supervisord 的 Web UI,訪問 http://服務器IP:9001 即可進入管理界面。可通過用戶名和密碼進行身份驗證。
Web UI 功能簡介:
- 查看所有受管進程的狀態
- 啟動、停止、重啟進程
- 查看進程日志
- 便于遠程管理和監控
注意:生產環境建議配置防火墻或反向代理,限制 Web UI 的訪問范圍,避免安全風險。
詳細說明
Supervisor 的 Web UI 是一個基于 HTTP 的管理界面,默認集成在 supervisord 主進程中,無需額外安裝。通過 Web 瀏覽器即可遠程管理和監控所有受 supervisord 管理的進程。
1. 訪問方式
- 啟用 [inet_http_server] 后,在瀏覽器中訪問
http://<服務器IP>:9001
。 - 需要輸入配置文件中設置的用戶名和密碼進行登錄。
- 支持局域網和公網訪問(建議生產環境僅限內網或通過 VPN/反向代理訪問)。
2. 界面主要功能
- 進程狀態總覽:主界面顯示所有受管進程的名稱、狀態(RUNNING、STOPPED、FATAL 等)、啟動時間、進程號等。
- 進程操作:可對單個或全部進程進行啟動、停止、重啟操作。
- 日志查看:可直接在網頁中查看每個進程的標準輸出(stdout)和標準錯誤(stderr)日志,支持實時刷新。
- 進程分組:如果配置了 group,可以分組顯示和管理進程。
- 自動刷新:界面支持自動刷新,便于實時監控。
3. 常見操作演示
- 啟動/停止/重啟進程:點擊對應進程后的"Start"、“Stop”、"Restart"按鈕即可。
- 查看日志:點擊"View Log"可彈出日志窗口,支持滾動和刷新。
- 一鍵操作全部進程:頁面頂部有"Start All"、“Stop All”、"Restart All"按鈕。
4. 權限與安全建議
- 默認僅支持單一用戶名和密碼,建議設置復雜密碼。
- 建議僅監聽 127.0.0.1(即
port=127.0.0.1:9001
),通過 SSH 隧道、VPN 或 Nginx 反向代理(帶認證)進行訪問。 - 如需公網訪問,務必做好防火墻限制和強密碼設置。
- 不支持多用戶分級權限,適合小型團隊或個人運維場景。
5. 常見問題
- 端口被占用:如 9001 端口被占用,可修改為其他未被占用端口。
- 無法訪問:檢查 supervisord 是否已重啟、端口監聽地址是否正確、防火墻是否放行。
- 安全風險:切勿將 Web UI 直接暴露在公網,避免被暴力破解。
6. 相關截圖與文檔
- 官方界面截圖可參考:Supervisor Web UI 截圖
- 更多配置說明見:Supervisor 官方文檔 - inet_http_server
4. 監控與日志
- systemctl:
- systemd 自帶強大的日志管理功能,通過 journalctl 來查看系統和服務的日志。
- 支持將日志集中管理并可以通過高級過濾器進行查詢。
- supervisord:
- supervisor 支持為每個進程定義獨立的日志文件,并可以配置標準輸出和錯誤輸出重定向。
- 可以實時查看每個進程的日志文件,但不會像 systemd 那樣提供統一的日志查看命令。
5. 依賴管理
- systemctl:
- 可以處理服務之間的依賴關系。例如,服務 A 依賴于服務 B,那么 systemd 可以確保在啟動 A 之前先啟動 B。
- 可以通過 Before=, After=, Requires=, Wants= 等指令來設置依賴順序。
- supervisord:
- 不直接處理依賴關系。各個進程通常被獨立管理,如果需要依賴關系管理,需要手動配置順序或借助外部工具。
6. 適用場景
- systemctl(systemd):
- 更適合管理系統級別的服務、網絡服務、守護進程、設備掛載等。
- 推薦用于服務器和系統服務的管理,因為它提供了豐富的功能來處理服務依賴、啟動順序、資源限制等。
- supervisord:
- 更適合管理獨立應用程序、Web 服務、批處理任務或需要獨立監控的進程。
- 尤其適合開發環境或容器中需要管理多個進程的情況。
7. 常用命令對照表
功能 | systemctl 命令 | supervisord/supervisorctl 命令 |
---|---|---|
啟動服務/進程 | systemctl start | supervisorctl start |
停止服務/進程 | systemctl stop | supervisorctl stop |
重啟服務/進程 | systemctl restart | supervisorctl restart |
查看狀態 | systemctl status | supervisorctl status |
開機自啟 | systemctl enable | 配置 autostart=true |
禁用開機自啟 | systemctl disable | 配置 autostart=false |
查看日志 | journalctl -u | 查看配置的日志文件 |
重新加載配置 | systemctl daemon-reload | supervisorctl reread/update |
8. 實際應用場景舉例
- systemctl 典型場景:
- 管理 Nginx、MySQL、Docker 等系統服務
- 設置服務開機自啟
- 管理定時任務、設備掛載等
- supervisord 典型場景:
- 管理 Python、Node.js 等 Web 應用進程
- 監控爬蟲、定時腳本等長期運行的任務
- 容器(如 Docker)中一鍵管理多個自定義進程
9. 優缺點對比小結
對比項 | systemctl (systemd) | supervisord |
---|---|---|
管理對象 | 系統服務、守護進程 | 應用進程、用戶自定義進程 |
配置復雜度 | 較高,需編寫 unit 文件 | 較低,配置靈活 |
日志管理 | 集中管理,支持過濾 | 各進程獨立日志 |
依賴管理 | 支持服務依賴、啟動順序 | 不支持,需要手動處理 |
適用場景 | 系統服務、服務器、生產環境 | 應用進程、開發環境、容器 |
自動重啟 | 支持(需配置 Restart) | 默認支持 |
跨平臺 | 僅 Linux | 跨平臺(Python 環境) |
10. 參考鏈接
- systemd 官方文檔
- Supervisor 官方文檔
- systemctl 使用詳解
- Supervisor 配置詳解
兩者可以根據不同的場景結合使用。如果你的需求是管理系統服務,systemctl 是更合適的選擇;如果你需要監控和自動重啟特定的應用程序進程,supervisord 更適合。