在 CentOS 7 中使用 systemd 創建自定義服務

systemd 創建自定義服務

  • 簡述創建自定義服務步驟
      • 文件覆蓋優先級
  • 創建服務流程
  • 在 /etc/systemd/system/ 目錄下創建 .service 文件(需 root 權限):
    • 編寫服務配置模板
      • Systemd 服務文件三大區塊詳解
        • [Unit] 區塊 - 服務元數據與依賴
        • [Service] 區塊 - 進程運行配置
        • [Install] 區塊 - 開機啟動配置
      • 完整示例
    • 設置權限和路徑
    • 管理服務命令
    • 啟動失敗排查
    • 注意事項

簡述創建自定義服務步驟

  • 創建服務文件:在 /etc/systemd/system/ 目錄下創建一個新的服務文件,例如 myapp.service。使用 sudo 權限進行創建。
  • 編輯服務文件:使用文本編輯器(如 vi 或 nano)編寫服務單元文件。
  • 重新加載 systemd 配置:每次修改服務文件后,需要運行 sudo systemctl daemon-reload 來重新加載配置。
  • 啟用服務:使用 sudo systemctl enable myapp.service 設置開機啟動。
  • 啟動服務:使用 sudo systemctl start myapp.service 啟動服務。
  • 檢查服務狀態:使用 sudo systemctl status myapp.service 查看服務狀態。

文件覆蓋優先級

在 CentOS 7 的 systemd 系統中,/usr/lib/systemd/system/ 和 /etc/systemd/system/ 兩個目錄有明確的區別:

  • systemd 加載配置的順序(從高到低):
/etc/systemd/system/service.d/*.conf
/etc/systemd/system/service
/run/systemd/system/service.d/*.conf(臨時配置)
/usr/lib/systemd/system/service.d/*.conf
/usr/lib/systemd/system/service
需求操作位置
安裝新服務/etc/systemd/system/
修改現有服務參數/etc/systemd/system/service.d/
完全替換服務文件/etc/systemd/system/
查看軟件原始配置/usr/lib/systemd/system/
添加開機啟動依賴/etc/systemd/system/service.d/

/lib/systemd/system/(實際上是 /usr/lib/systemd/system/ 的符號鏈接)

特性/usr/lib/systemd/system//etc/systemd/system/
來源軟件包安裝的原始服務文件管理員自定義的服務文件或覆蓋配置
優先級高(覆蓋 /lib/ 中的配置)
是否會被覆蓋軟件升級時可能被覆蓋不會被軟件升級覆蓋
推薦修改方式不應直接修改應在此目錄添加自定義配置
目錄類型系統默認目錄(只讀)管理員配置目錄(可寫)
  • 作用:存放軟件包(通過 yum/rpm 安裝)提供的原始服務文件
  • 特點:
    • 系統級別的默認配置
    • 軟件升級時會覆蓋此目錄的文件
    • 不要直接修改這里的文件(修改會被覆蓋)

創建服務流程

在 /etc/systemd/system/ 目錄下創建 .service 文件(需 root 權限):

sudo vi /etc/systemd/system/myapp.service

編寫服務配置模板

[Unit]
Description=服務描述
After=network.target    # 依賴關系[Service]
Type=forking     # 服務類型
ExecStart=/path/to/command
User=username           # 運行用戶
Restart=on-failure      # 重啟策略[Install]
WantedBy=multi-user.target

Systemd 服務文件三大區塊詳解

[Unit]
? 服務標識 (Description)
? 啟動順序 (After/Before)
? 依賴關系 (Requires/Wants)
[Service][Install]
? 進程控制 (Type/ExecStart)? 開機啟動目標 (WantedBy)
? 運行環境 (User/Env)? 別名管理 (Alias)
? 資源限制 (MemoryLimit)
? 安全策略 (PrivateTmp)
[Unit] 區塊 - 服務元數據與依賴

定義服務的描述、依賴關系和啟動順序

指令說明示例值
Description必填 服務描述信息(顯示在 systemctl status 中)Description=Nginx Web Server
After定義啟動順序依賴(在此服務之后啟動)After=network.target
Before定義反向依賴(在此服務之前啟動)Before=shutdown.target
Requires強依賴 - 依賴服務失敗則本服務失敗Requires=mysql.service
Wants弱依賴 - 依賴服務失敗不影響本服務Wants=postfix.service
Conflicts沖突服務 - 不能同時運行的服務Conflicts=httpd.service
Documentation服務文檔鏈接Documentation=man:nginx(8)
Condition…啟動條件檢查(如 ConditionPathExists=/etc/nginx.conf)

[Unit] 區塊示例

[Unit]
Description=High Performance Web Server
After=network.target remote-fs.target nss-lookup.target
Wants=postgresql.service
Documentation=https://nginx.org/en/docs/
[Service] 區塊 - 進程運行配置

定義服務進程的執行方式和運行時行為

類別指令說明常用值
啟動類型Type必填 進程啟動類型simple、forking、oneshot、notify
ExecStart必填 啟動命令(絕對路徑)/usr/sbin/nginx -g “daemon off;”
ExecStartPre主命令前執行的預備命令/bin/mkdir -p /run/nginx
ExecStartPost主命令后執行的后續命令/bin/echo “Service started”
ExecReload重載服務時執行的命令/bin/kill -HUP $MAINPID
運行環境User運行服務的用戶nginx、nobody
Group運行服務的用戶組www-data
WorkingDirectory工作目錄/var/www/html
Environment設置環境變量PORT=8080
EnvironmentFile從文件加載環境變量/etc/sysconfig/nginx
重啟策略Restart服務退出時重啟策略no、always、onfailure、on-abort
RestartSec重啟前等待時間5s、1min
資源限制MemoryLimit內存限制512M
CPUQuotaCPU配額80%
安全控制PrivateTmp使用私有/tmp目錄(增強安全)true
ProtectSystem文件系統保護級別full、strict

[Service]示例

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
User=nginx
Group=nginx
Environment="NGINX_LOGLEVEL=info"
Restart=on-failure
RestartSec=5s
MemoryLimit=500M
PrivateTmp=true

常見 Type 類型:

特性Type=simpleType=forking
工作方式主進程直接在前臺運行主進程 fork 子進程后退出
systemd 監控對象ExecStart 啟動的進程fork 出來的子進程
適用場景現代應用 (Python/Node.js/Go 等)傳統守護進程 (Nginx/MySQL 等)
PID 文件不需要必須 通過 PIDFile= 指定
啟動完成判定立即標記為 active需等待主進程退出
日志處理自動捕獲 stdout/stderr需程序自行處理日志
啟動速度快 (直接啟動)稍慢 (需完成 fork 過程)
典型應用Flask, Redis, systemd 自身服務Apache, PostgreSQL, Zabbix Server

在這里插入圖片描述

判斷應該使用哪種類型:

# 手動測試啟動程序
/usr/sbin/nginx -c /etc/nginx/nginx.conf# 觀察行為:
# 1. 如果命令立即返回且后臺有進程 → forking
# 2. 如果命令阻塞在前臺 → simple
[Install] 區塊 - 開機啟動配置

定義服務安裝到哪個運行級別(target)

指令說明示例值
WantedBy必填 指定服務關聯的 target(實現開機啟動)multi-user.target
RequiredBy指定強依賴本服務的 targetgraphical.target
Alias服務別名Alias=webserver.service
Also安裝時同時啟用的其他服務Also=nginx-sockets.service

[Install] 示例

[Install]
WantedBy=multi-user.target
Alias=web.service

完整示例

[Unit]
Description=My Custom Application   # 服務描述
After=network.target                # 在網絡啟動后運行[Service]
Type=simple                         # 服務類型(常用 simple 或 forking)
User=appuser                        # 運行服務的用戶
Group=appgroup                      # 運行服務的組
WorkingDirectory=/opt/myapp         # 工作目錄
ExecStart=/usr/bin/java -jar /opt/myapp/app.jar  # 啟動命令(必須絕對路徑)
Restart=on-failure                  # 失敗時自動重啟  
RestartSec=5s                       # 重啟間隔
Environment="PORT=8080"             # 設置環境變量
PrivateTmp=true                     # 啟用私有臨時目錄(安全增強)# 日志配置(可選)
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=myapp[Install]
WantedBy=multi-user.target          # 多用戶模式下啟用

設置權限和路徑

# 確保可執行文件有權限
sudo chmod +x /opt/myapp/start.sh
# 環境變量文件(可選)
sudo vi /etc/sysconfig/myapp  # 定義變量 APP_ENV=production

服務文件中引用:

EnvironmentFile=/etc/sysconfig/myapp
ExecStart=/opt/myapp/start.sh ${APP_ENV}

管理服務命令

# 重載 systemd 配置(修改服務文件后必須執行)
sudo systemctl daemon-reload# 啟動/停止服務
sudo systemctl start myapp.service
sudo systemctl stop myapp.service# 設置開機自啟
sudo systemctl enable myapp.service# 查看狀態和日志
systemctl status myapp         # 服務狀態
journalctl -u myapp -f         # 實時日志(-f 跟蹤日志)
journalctl -u myapp --since "2020-01-01" --until "1 hour ago"  # 時間篩選

啟動失敗排查

systemctl status myapp      # 查看錯誤摘要
journalctl -xe              # 檢查詳細日志
  • 測試啟動命令: 手動執行 ExecStart 中的命令,驗證路徑和權限。
  • 環境變量問題: 使用 systemctl show myapp 檢查最終環境變量

注意事項

  • 路徑必須為絕對路徑(包括腳本和命令)
  • 修改服務文件后必須執行 daemon-reload
  • 生產環境建議用非 root 用戶運行(User=)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/93297.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/93297.shtml
英文地址,請注明出處:http://en.pswp.cn/web/93297.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【QT】printsupport庫遠程實現打印機打印

【QT】printsupport庫遠程實現打印機打印 前言 思路 實現 當前所有可用打印機瀏覽 打印預覽 打印輸出 手動選擇打印 自動打印 防呆補充 庫打包 前言 在打印機的通訊控制方式中,有USB、網口、串口、WIFI等,針對局域網環境下,用自研軟件控制打印機打印的應用場景,針對自研軟…

LT3045EDD#TRPBF ADI亞德諾 超低噪聲LDO穩壓器 電子元器件IC

LT3045EDD#TRPBF ADI 超低噪聲LDO穩壓器專業解析1. 產品技術檔案LT3045EDD#TRPBF是ADI(Analog Devices Inc.)推出的超低噪聲/超高PSRR線性穩壓器,采用DFN-12 (3x3mm)封裝,以其0.8μVRMS超低噪聲和79dB超高頻PSRR成為精密電源設計。…

易語言模擬真人鼠標軌跡算法 - 非貝塞爾曲線

一.簡介 鼠標軌跡算法是一種模擬人類鼠標操作的程序,它能夠模擬出自然而真實的鼠標移動路徑。 鼠標軌跡算法的底層實現采用C/C語言,原因在于C/C提供了高性能的執行能力和直接訪問操作系統底層資源的能力。 鼠標軌跡算法具有以下優勢: 模擬人…

Spring Boot 3 數據源連接信息存儲方法

在Spring Boot 3中,數據源連接信息的存儲方式主要有以下幾種,根據安全性和環境需求選擇合適的方式: 1. 配置文件(推薦基礎方式) 位置:src/main/resources/application.properties 或 application.yml 示例…

按鍵序列常用示例

按鍵序列常用示例 按鍵編碼 基礎按鍵對應編碼 A-Z 原字符即可 KeyCodeSHIFTCTRL^ALT% 其他按鍵 KeyCodeBACKSPACE{BACKSPACE}, {BS}, or {BKSP}BREAK{BREAK}CAPS LOCK{CAPSLOCK}DEL or DELETE{DELETE} or {DEL}DOWN ARROW{DOWN}END{END}ENTER{ENTER} or ~ESC{ESC}HELP{HEL…

【LeetCode Solutions】LeetCode 熱題 100 題解(36 ~ 40)

CONTENTS二叉樹 - LeetCode 94. 二叉樹的中序遍歷(簡單)二叉樹 - LeetCode 104. 二叉樹的最大深度(簡單)二叉樹 - LeetCode 226. 翻轉二叉樹(簡單)二叉樹 - LeetCode 101. 對稱二叉樹(簡單&…

數據處理分析環境搭建+Numpy使用教程

環境搭建 數據分析常用開源庫 Numpy NumPy(Numerical Python) 是 Python 語言的一個擴展程序庫。是一個運行速度非常快的數學庫,主要用于數組計算包含: 一個強大的N維數組對象 ndarray廣播功能函數整合 C/C/Fortran 代碼的工具線性代數、傅里葉變換、隨機…

實戰多屏Wallpaper壁紙顯示及出現黑屏問題bug分析-學員作業

背景: 在大家看了上一篇google官方對于多屏壁紙這塊的介紹后 安卓Wallpaper壁紙部分對多屏的支持-Google官方文檔介紹 可能還是對于壁紙支持多屏這塊沒有相關的實戰性的認知,所以本文就開始帶大家來進行部分解讀和實戰。 壁紙多屏顯示原理文檔解讀&a…

Vue插槽---slot詳解

1、什么是 Vue 插槽?Vue 插槽(Slot)?? 是 Vue 提供的一種非常強大且靈活的機制,用于實現:父組件向子組件傳遞一段模板內容(HTML / 組件等),讓子組件在指定位置動態渲染這些內容。可…

STM32 - Embedded IDE - GCC - 顯著減少固件的體積

導言如上圖所示,在編譯器附加選項(全局)里添加--specsnano.specs,告訴編譯器使用newlib-nano替代newlib去編譯代碼。 newlib vs. newlib-nano newlib 是 GNU ARM 工具鏈默認的 C 標準庫,功能完整,但體積較大…

python的美食交流社區系統

前端開發框架:vue.js 數據庫 mysql 版本不限 后端語言框架支持: 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 數據庫工具:Navicat/SQLyog等都可以 摘要&…

《Redis持久化機制對比與RDB/AOF調優方案》

📚 Redis持久化機制對比與RDB/AOF調優方案 🧠前言 在生產環境中,Redis 常常被用作緩存,但在更多場景下,它還存儲著核心業務數據(如會話、訂單、隊列任務等)。一旦 Redis 宕機、數據丟失&#…

eXtremeDB 醫療設備開發實戰:從合規到實時,構建 EN62304 級數據管理系統

在醫療設備開發領域,數據管理的 “可靠性” 與 “合規性” 是不可逾越的紅線 —— 監護儀心率數據的丟失可能延誤診斷時機,胰島素泵劑量記錄的錯誤則直接威脅患者生命安全。eXtremeDB 憑借對 EN62304 標準的深度合規支持、硬實時數據處理能力及多層次安全…

linux 設備驅動的分層思想

一、 概述像這樣的分層設計在linux的input、RTC、MTD、I2c、SPI、tty、USB等諸多類型設備驅動中屢見不鮮,下面對這些驅動進行詳細的分析。二、 輸入設備驅動輸入設備(如按鍵、鍵盤、觸摸屏、鼠標等)是典型的字符設備,其一般的工…

【嵌入式硬件實例】-555定時器驅動直流無刷電機

555定時器驅動直流無刷電機 文章目錄 555定時器驅動直流無刷電機 1、555定時器介紹 2、BLDC,無刷直流電機 3、DRV10866 驅動器 4、硬件準備與接線 5、電路工作原理 在這個項目中,我們將使用 555 定時器 IC 和 DRV10866 驅動器 IC 制作 BLDC、無刷直流電機驅動電路。無刷電機可…

Helm 常用命令 + Bitnami 中間件部署速查表

文章目錄一、Helm 常用命令速查表1.1. 倉庫管理1.2. Chart 搜索1.3. 應用部署1.4. 應用管理二、Bitnami 常用中間件部署示例三、常用自定義參數(values.yaml 配置項)四、安裝后的訪問方式五、一鍵安裝腳本 install-middleware.sh5.1. 完整腳本5.2. 使用方…

Ansible 自動化運維實戰系列(六):Valut詳解

Ansible 自動化運維實戰系列(六):Valut詳解📚 系列導航一:概述二:命令1)創建加密文件2)加密已有文件3)查看加密文件4)編輯加密文件5)解密文件6&am…

《探秘瀏覽器Web Bluetooth API設備發現流程》

網頁若需與藍牙設備通信,往往需依賴本地客戶端或專用驅動程序作為中介,不僅增加了用戶操作成本,也限制了Web應用在跨設備場景中的拓展。而Web Bluetooth API的出現,直接賦予了網頁與低功耗藍牙(BLE)設備對話的能力,從智能手環的健康數據同步,到智能家居設備的遠程控制,…

Jenkins+Python自動化持續集成詳細教程

Python接口自動化測試零基礎入門到精通(2025最新版)Jenkins安裝 ? Jenkins是一個開源的軟件項目,是基于java開發的一種持續集成工具,用于監控持續重復的工作,旨在提供一個開放易用的軟件平臺,使軟件的持續…

C++面試——內存

一、簡述堆和棧的區別維度棧(Stack)堆(Heap)生命周期隨函數調用自動創建/銷毀由程序員或垃圾回收器控制分配速度極快(僅移動指針)慢(需查找空閑塊、維護元數據)空間大小較小&#xf…