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