使用情境
Process management 最主要的目的是管理開機後應用程式
- 啟用服務
- 重啟服務
- 定時執行
以 Nodejs 為例通常使用 PM2 或 GCP App engine,當服務在單一 GCE instance 上運行時,就得自己找工具管理,找到了 Linux 上的 systemd,另一個比較常見的選項是 supervisor,可自行尋找相關的比較
選擇 systemd 的原因是 Linux 系統自帶,不用另外多做安裝,且符合目前服務的基本需求
將 Nodejs 服務打包成 systemd 的 service
1. 新增 service 文件
sudo nano /etc/systemd/system/your_service.service
2. 編輯 service 設定
[Unit]
After=network.target
# 服務名稱
Description=Your Node.js Service App
[Service]
Type=simple
# 設定環境變數
WorkingDirectory=/app/your_service
Environment=NODE_PORT=3000 NODE_ENV=production
# 執行服務的使用者
User=root
# 啟動服務指令
ExecStart=/usr/bin/node /app/your_service/index.js
# 不正常停止時重新啟動
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
3. 啟用 service
# 讀取新的設定
sudo systemctl daemon-reload
# 啟用服務
sudo systemctl start your_service
# 開機自動啟用
sudo systemctl enable your_service
4. 查看 Service
sudo systemctl status your_service
5. 測試 Service
ps aux | grep node (choose your_service)
sudo kill -9 <pid>
journalctl -u your_service.service
當服務被 kill 時會重啟,但如果是透過 systemctl 將服務停止則不會
使用 systemd 定時執行服務
如果想要讓服務在固定的時間啟用,一般可以使用 cronJob 等服務,在討論區看到 systemd 也能做到定時啟用服務
1. 新增 systemd timer 文件
sudo nano /etc/systemd/system/your_service.timer
2. 編輯 systemd timer 文件
[Unit]
Description=Your service run every 10 seconds
[Timer]
OnBootSec=10
OnUnitActiveSec=10
AccuracySec=1ms
[Install]
WantedBy=timers.target
3. 啟用 Timer service
sudo systemctl daemon-reload
sudo systemctl enable --now your_service.timer
4. 查看 Timer service
sudo systemctl status your_service
5. 測試 Timer service
journalctl -u your_service.service
查看使否有定時執行的紀錄
Note: 如果是參考以上的例子,記得要把正在運行的 your_service.service 停掉或用別的 service
sudo systemctl stop your_service.service
sudo systemctl disable your_service.service
因為目的是透過 timer 每十秒執行一次,所以 systemctl 要做用在 timer 上
現在很多雲端服務都有幫忙處理好重啟,如果是自己從零開始在 Linux 上開始建立服務,可以考慮用這個方式做管理