systemd 服務單元檔案教學

systemd 是 Linux 系統中用於管理系統和服務的一個核心工具。在 Red Hat Linux 系統上,使用 systemd 服務單元檔案可以高效地配置和管理 .NET 服務。本文將逐步介紹如何建立和配置 systemd 服務。

設定檔案範例 demo.service

[Unit]
Description= Demo Service

[Service]
Type=simple
WorkingDirectory=/path/to/working/directory
ExecStart=/bin/dotnet /path/to/executable
Restart=always

# 若 dotnet 服務崩潰後,10秒後重啟服務:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-worker
User=userId
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
Environment=EXAMPLE_VAR=example_value

[Install]
WantedBy=multi-user.target

當然可以。以下是 systemd 服務單元檔案(Unit file)的完整說明,包括 [Unit][Service][Install] 部分的詳細介紹:

systemd 服務單元檔案結構

1. [Unit] 部分

這部分提供了服務的基本資訊和描述。

  • Description: 簡要描述服務的功能或目的。
  • After/Before: 定義服務啟動的順序相對於其他單元。
  • Requires/Wants: 列出啟動此服務前需要啟動的其他單元。
  • BindsTo: 類似於 Requires,但更強烈地表達依賴關係。如果被綁定的單元消失,該服務也會停止。

2. [Service] 部分

定義了服務如何運行和管理。

  • Type: 指定服務的啟動類型(例如 simple, forking, oneshot, notify, dbus)。Type=simple: 表示主服務二進制文件執行後,服務立即啟動。
  • WorkingDirectory: 指定服務的工作目錄。例如: WorkingDirectory=/path/to/working/directory
  • ExecStart: 定義啟動服務的命令。例如: ExecStart=/bin/dotnet /path/to/executable
  • ExecStop: 定義停止服務時執行的命令。
  • Restart=always: 無論退出狀態如何,都會重新啟動服務。指定在什麼情況下應重新啟動服務(例如 always, on-failure, never
  • RestartSec=10: 服務崩潰後重啟前的等待時間(秒)。
  • KillSignal=SIGINT: 用於停止服務的信號。
  • SyslogIdentifier: 在系統日誌中的服務標識符。
  • User/Group: 指定以哪個用戶或群組身份運行服務。
  • Environment: 設置服務的環境變數。

3. [Install] 部分

控制服務的安裝和啟用行為。

  • WantedBy: 定義在啟用服務時應該將服務添加到哪個 target 的「wants」目錄中。常見的設定是 multi-user.target

4. 設定每三小時自動重啟

為了每三小時自動重啟服務,需建立 .timer 單元檔案。下列範例為demo.timer

[Unit]
Description=每三小時重啟 Demo Service

[Timer]
OnBootSec=3h
OnUnitActiveSec=3h
Unit=demo.service

[Install]
WantedBy=timers.target
  • OnBootSecOnUnitActiveSec 設為 3h,表示計時器將在系統啟動後及單位最後一次啟用後三小時啟動。

5. 啟用和啟動服務

建立服務單元檔案和計時器檔案後,使用以下命令來啟用和啟動:

sudo systemctl enable demo.service
sudo systemctl start demo.service
sudo systemctl enable demo.timer
sudo systemctl start demo.timer

使用指南

  • 建立這樣的檔案後,通常將其保存於 /etc/systemd/system/ 目錄下。
  • 使用 systemctl 命令來啟用和管理這個服務:例如 systemctl start myservice.service 啟動服務,systemctl enable myservice.service 使服務在啟動時自動運行。

這樣的服務單元檔案是 systemd 使用的標準方式,用於在 Linux 系統中配置和管理服務。透過 systemd,你可以在 Red Hat Linux 系統上靈活地管理 .NET 服務。本指南提供了配置服務所需的所有步驟,幫助你輕鬆實現高效的服務管理。