• 正文
  • 相关推荐
申请入驻 产业图谱

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

10/30 13:11
743
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

上期我们说到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配置

sudo systemctl daemon-reload

必须操作:跳过此步骤会导致Systemd无法识别新服务配置!

2.2 启动服务

sudo systemctl start my_service

服务名规则:my_service对应/etc/systemd/system/my_service.service的文件名(无需加.service后缀)。

2.3 检查服务状态

systemctl status 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 15:00:00 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 systemctl enable my_service

输出示例:

Created symlink /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 停止服务

sudo systemctl stop my_service

2.7 重启服务

sudo systemctl restart my_service

3. 完整流程示例

# 创建服务文件sudo nano /etc/systemd/system/my_service.service
# 写入配置内容并保存后...sudo systemctl daemon-reloadsudo systemctl start my_servicesudo systemctl enable my_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等专用协议,可广泛满足各类储能系统的本地能源管理应用需求。

致远电子

致远电子

广州致远电子股份有限公司成立于2001年,注册资金5000万元,国家级高新技术认证企业,广州市高端工控测量仪器工程技术研究开发中心,Intel ECA全球合作伙伴和微软嵌入式系统金牌合作伙伴。

广州致远电子股份有限公司成立于2001年,注册资金5000万元,国家级高新技术认证企业,广州市高端工控测量仪器工程技术研究开发中心,Intel ECA全球合作伙伴和微软嵌入式系统金牌合作伙伴。收起

查看更多

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录