上期我们说到sysv的规范,创建以及示例,那么我们今天就来讲讲Systemd的原生服务配置。
为何要迁移到Systemd原生服务?
尽管规范化的SysV脚本可临时解决问题,但可能存在以下缺陷:
- 效率低下:串行启动拖慢系统初始化。
- 依赖管理脆弱:静态依赖无法处理动态资源(如网络连接就绪)。
- 功能缺失:无自动重启、资源限制、日志聚合等特性。
- 旧时代产物:sysv相比与system原生服务相对更加老旧,为了兼容system可能会导致各种不便利。
Systemd原生服务配置最佳实践
1. Systemd服务文件基础
创建/etc/systemd/system/my_service.service。
[Unit]Description=My Custom ServiceAfter=network.target syslog.target# 明确依赖顺序Requires=network.target# 硬依赖(失败则终止)
[Service]Type=simple# 主进程类型(simple/forking)ExecStart=/usr/bin/my_daemon --config /etc/my.confExecStop=/bin/kill -TERM$MAINPID# 可选,默认发送SIGTERMRestart=on-failure# 自动重启策略User=appuser# 降权运行Group=appgroupEnvironment=DEBUG=false# 环境变量
[Install]WantedBy=multi-user.target# 默认启用级别
1.1 服务类型(Type)

1.2 自动重启策略(Restart)
Restart=always# 无条件重启Restart=on-failure# 退出码非0时重启RestartSec=5# 重启前等待时间
1.3 资源限制
MemoryLimit=512M# 内存限制CPUQuota=80%# CPU时间配额LimitNOFILE=65535# 文件描述符数
1.4 日志管理
StandardOutput=journal# 默认输出到JournaldStandardError=journal# 或自定义日志文件(需配合日志轮转)StandardOutput=file:/var/log/my_service.log
2. Systemd服务启动
那么,当我已经创建好了/etc/systemd/system/my_service.service并写好了内容,我该如何启动这个服务?
2.1 重载Systemd配置
sudosystemctl daemon-reload
必须操作:跳过此步骤会导致Systemd无法识别新服务配置!
2.2 启动服务
sudosystemctl start my_service
服务名规则:my_service对应/etc/systemd/system/my_service.service的文件名(无需加.service后缀)。
2.3 检查服务状态
systemctlstatus my_service
关键输出解读:
my_service.service - My Custom Service
Loaded: loaded (/etc/systemd/system/my_service.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2023-10-10 1500 UTC; 5s ago # 服务已成功运行
Main PID: 1234 (my_daemon)
Tasks: 1 (limit: 4915)
CGroup: /system.slice/my_service.service
└─1234 /usr/bin/my_daemon --config /etc/my.conf
2.4 设置开机自启
sudo systemctlenablemy_service
输出示例:
Createdsymlink/etc/systemd/system/multi-user.target.wants/my_service.service → /etc/systemd/system/my_service.service
2.5 实时查看服务日志
journalctl-u my_service -f
u:过滤特定服务的日志
f:实时跟踪(类似tail -f)
2.6 停止服务
sudosystemctl stop my_service
2.7 重启服务
sudosystemctl restart my_service
3. 完整流程示例
# 创建服务文件sudo nano /etc/systemd/system/my_service.service
# 写入配置内容并保存后...sudo systemctl daemon-reloadsudo systemctl start my_servicesudo systemctlenablemy_servicesystemctl status my_service
总结:SysV与Systemd对比差异1. 服务启动方式
- SysV:采用串行启动,服务按运行级别(runlevel)顺序执行脚本,每个服务需等待前一个完成再启动。运行级别通过/etc/rc.d/rcN.d目录下的脚本控制(N为0-6)。
- Systemd:支持并行启动,通过依赖关系和单元(unit)定义实现多服务同时启动,显著缩短启动时间。例如,基于socket激活机制,服务无需完全启动即可响应请求。
2. 服务管理模型
- SysV:服务以独立脚本形式存储在/etc/init.d目录,依赖service或chkconfig命令管理。服务状态需手动检查(如ps命令)。
- Systemd:服务以单元文件(.service)定义,集中在/usr/lib/systemd/system目录,通过systemctl统一管理。支持服务状态监控、日志集成(journalctl)及自动重启策略。
3. 依赖关系处理
- SysV:依赖关系通过脚本中的条件判断硬编码实现,灵活性差,容易因顺序错误导致启动失败。
- Systemd:在单元文件中通过After、Requires等指令明确定义依赖关系,系统自动解析并优化启动顺序,确保服务按需加载。
4. 优缺点总结

EM系列储能边缘智能网关
EM系列储能边缘智能网关是ZLG致远电子专为新能源储能系统设计的一款高性能、多接口通讯管理设备,可在储能系统应用中作为边缘EMS(能源管理系统)总控、通讯管理机、规约转换器或BAU(电池管理总控)使用。该系列产品集成丰富的外设接口,支持各类BMS、PCS、空调、电表、屏显等设备的通讯传输,且软件上支持RT-Linux、Ubuntu等操作系统,支持IEC-61850/IEC-104/EtherCAT等专用协议,可广泛满足各类储能系统的本地能源管理应用需求。
-
配置
+关注
关注
1文章
194浏览量
19393 -
智能网关
+关注
关注
6文章
891浏览量
51599
发布评论请先 登录
云原生技术概述 云原生火爆成为升职加薪核心必备
Linux使用Systemd管理进程服务
Linux使用Systemd管理进程服务
如何在 Linux 上从 NetworkManager 切换为 systemd
i.M8XMQ开发板如何通过Systemd服务实现应用自启
云原生技术将是企业落地微服务的优秀伴侣
解析云原生技术发展趋势及实践应用
云原生技术下的华为云DevOps实践之路
诚邀报名|在开发者大会,洞悉云原生技术落地最佳实践
Systemd是什么?Systemd Service配置文件详解
Linux网络管理的关键技术和最佳实践
【技术分享】正确编写SysV Init脚本以实现Systemd兼容(上)

【技术分享】Systemd原生服务配置最佳实践(下)
评论