使用情境

Process management 最主要的目的是管理開機後應用程式

  1. 啟用服務
  2. 重啟服務
  3. 定時執行

以 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 上開始建立服務,可以考慮用這個方式做管理

Reference