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…