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

描述

上期我们说到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 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 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等专用协议,可广泛满足各类储能系统的本地能源管理应用需求。

 

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分