RK3576-UGFCRK3562-UGFCRK3568-UGFC(Old)NXP-8MP-UGFC(Old)NXPT507-UGFC(Old)芯驰D9-UGFCUGFCT113瑞萨Cortex-A55  RZ/G2L核心板瑞萨Cortex-A55  RZ/G2UL核心板全志Cortex-A7  T3/A40i核心板全志双核Cortex-A7  T113核心板NXP 6ULL核心板NXP 6D/6Q核心板NXP i.MX8Mmini核心板NXP i.MX8MPlus核心板芯驰D9核心板TI  Cortex-A8  AM335x核心板芯驰X9核心板MP135MP157(旧)RK3506-EG100 主板(旧)RK3506-EG1200主板(旧)RK3506-EG1800主板横屏显示模板RK3506邮票孔RK3506模组RV1126-B2BRK3588-B2BRK3576-B2BRK3568-B2BEG100-主板EG100-网关EG1200-主板EG1200-网关EG1800-主板EG1800-网关热销平台核心板 开发板HD-RK3506G-MINI卡片电脑HD-RK3576-PI卡片电脑HD-RK3506G-EVM(新)RK3506G-MINI卡片电脑多功能4G工业网关高性能4G工业网关轻量级4G网关多功能HD6UL-4G-GW 工控板轻量级HD-202D-GW工控板高性价比HD-G2UL-GW工控板边缘智能工业网关RK3568 OPS储能EMS网关控制器工控板工业网关(改新)7寸HMI(新)10.1寸工业平板(新)15.6寸工业平板(新)18.5寸工业平板(新)21.5寸工业平板PD070B1M2PD101A46PD156A46PD185A46PD215A46工业平板7寸LCD 电阻触摸屏7寸RGB电容触摸屏3.1寸电容套件5寸MIPI电容套件-3576-PI7寸MIPI电容屏(新)5寸电容套件(新)7寸电容套件232/485/CAN扩展板显示屏 配件板HD-RK3506G-MINI卡片电脑(新)RK3506-EG100 网关(新)RK3506-EG1200网关(新)RK3506-EG1800网关工业网关IMX219摄像头模组GC2093摄像头模组摄像头模块

Linux项目开发,你必须了解Systemd服务!

20
发表时间:2024-06-18 17:07

1. Systemd 简介

Systemd是什么,以前linux系统启动init机制,由于init一方面对于进程的管理是串行化的,容易出现阻塞情况,另一方面init也仅仅是执行启动脚本,并不能对服务本身进行更多的管理。Systemd就是为了解决这些问题而诞生的。它的设计目标是,为系统的启动和管理提供一套完整的解决方案,根据Linux惯例,字母d是守护进程(daemon)的缩写,Systemd这个名字的含义,就是它要守护整个系统。使用了Systemd,就不需要再用init了。Systemd取代了initd,成为系统的第一个进程(PID 等于 1),其他进程都是它的子进程。

Systemd是目前Linux系统上主要的系统守护进程管理工具,有如下特点:

1.支持并行化任务

2.同时采用socket式与D-Bus总线式激活服务;

3.按需启动守护进程(daemon);

4.利用Linux的cgroups监视进程;

5.支持快照和系统恢复;

6.维护挂载点和自动挂载点;

7.各服务间基于依赖关系进行精密控制。

Systemd可以管理所有系统资源,不同的资源统称为 Unit(单元),Unit一共分成以下12种。

1.Service:装守护进程的启动、停止、重启和重载操作,是最常见的一种 Unit 文件

2.Target:多个Unit构成的一个逻辑组,用于对 Unit 文件进行逻辑分组,引导其它 Unit 的执行。它替代了 SysV-init 运行级别的作用,并提供更灵活的基于特定设备事件的启动方式

3.Device:硬件设备,主要用于定义设备之间的依赖关系

4.Mount:文件系统的挂载点,可以替代过去的 /etc/fstab 配置文件

5.Automount:自动挂载点,相当于 SysV-init 的 autofs 服务

6.Path:用于监控指定文件或路径的变化,并触发其它 Unit 运行

7.Scope:不是用户创建的,而是 Systemd 运行时产生的,描述一些系统服务的分组信息

8.Slice:进程组,用于表示一个 CGroup 的树,通常也不是用户创建的

9.Snapshot:Systemd快照,可以切回某个快照

10. Socket:监控来自于系统或网络的数据消息,用于实现基于数据自动触发服务启动

11. Swap:虚拟内存的交换分区

12. Timer Unit:定时器,用于配置在特定时间触发的任务,替代了 Crontab 的功能

2. Systemd Service配置文件

每一个被管理单元(Unit)都需要有一个配置文件用于告知systemd对于该单元(Unit)的管理方式。Systemd默认从目录/etc/systemd/system/读取配置文件,但是里面存放的大部分文件都是符号链接,指向目录/lib/systemd/system,配置文件存放于/lib/systemd/system/,开机启动后会在/etc/systemd/system目录建立软链接文件,systemctl enable命令用于在/etc/systemd/system/与/lib/systemd/system/两个目录之间建立符号链接关系。systemctl disable命令用于在两个目录之间撤销符号链接关系,相当于撤销开机启动。配置文件的后缀名,就是该Unit的种类,比如sshd.socket;如果命令行中省略后缀名,Systemd默认后缀名为.service,所以当systemctl enable sshd会被理解成systemctl enable sshd.service。

以sshd.service的配置为例,可用”systemctl cat sshd.service” 命令查看sshd服务的配置文件:

# /lib/systemd/system/ssh.service[Unit]Description=OpenBSD Secure Shell serverDocumentation=man:sshd(8) man:sshd_config(5)After=network.target auditd.serviceConditionPathExists=!/etc/ssh/sshd_not_to_be_run[Service]EnvironmentFile=-/etc/default/sshExecStartPre=/usr/sbin/sshd -tExecStart=/usr/sbin/sshd -D $SSHD_OPTSExecReload=/usr/sbin/sshd -tExecReload=/bin/kill -HUP $MAINPIDKillMode=processRestart=on-failureRestartPreventExitStatus=255Type=notifyRuntimeDirectory=sshdRuntimeDirectoryMode=0755[Install]WantedBy=multi-user.targetAlias=sshd.service

通常一个service服务单元的配置包含3个区块:Unit,Service和Install。

2.1      Unit区块

[Unit]区块通常是配置文件的第一个区块,用来定义 Unit 的元数据,以及配置与其他 Unit 的关系。它的主要字段如下:

Description:简短描述

Documentation:文档地址

Requires:当前Unit依赖的其他Unit,如果它们没有运行,当前Unit会启动失败

Wants:与当前Unit配合的其他Unit,如果它们没有运行,当前Unit不会启动失败

BindsTo:与Requires类似,它指定的 Unit 如果退出,会导致当前Unit停止运行

Before:如果该字段指定的Unit也要启动,那么必须在当前Unit之后启动

After:如果该字段指定的Unit也要启动,那么必须在当前Unit之前启动

Conflicts:这里指定的Unit 不能与当前Unit同时运行

Condition...:当前Unit运行必须满足的条件,否则不会运行

Assert...:当前Unit运行必须满足的条件,否则会报启动失败

2.2      Service区块

[Service]区块用来Service的配置,只有Service类型的Unit才有这个区块。它的主要字段如下:

Type:定义启动时的进程行为。它有以下几种值。

Type=simple:默认值,执行ExecStart指定的命令,启动主进程

Type=forking:以fork方式从父进程创建子进程,创建后父进程会立即退出

Type=oneshot:一次性进程,Systemd会等当前服务退出,再继续往下执行

Type=dbus:当前服务通过D-Bus启动

Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行

Type=idle:若有其他任务执行完毕,当前服务才会运行

ExecStart:启动当前服务的命令

ExecStartPre:启动当前服务之前执行的命令

ExecStartPost:启动当前服务之后执行的命令

ExecReload:重启当前服务时执行的命令

ExecStop:停止当前服务时执行的命令

ExecStopPost:停止当其服务之后执行的命令

RestartSec:自动重启当前服务间隔的秒数

Restart:定义何种情况Systemd会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog

TimeoutSec:定义Systemd停止当前服务之前等待的秒数

Environment:指定环境变量

2.3      Install区块

[Install]通常是配置文件的最后一个区块,用来定义如何启动,以及是否开机启动。它的主要字段如下:

WantedBy:它的值是一个或多个Target,当前Unit激活时(enable)符号链接会放入/etc/systemd/system目录下面以Target名+.wants后缀构成的子目录中

RequiredBy:它的值是一个或多个Target,当前Unit激活时,符号链接会放入/etc/systemd/system目录下面以Target 名 + .required后缀构成的子目录中

Alias:当前Unit 可用于启动的别名

Also:当前Unit激活(enable)时,会被同时激活的其他Unit

3. 服务监控启动

3.1      socket 触发的服务

涉及网络的服务,可以通过 socket 来触发启动。也就是说服务本身在没连接业务时不用一直空跑着,可以让systemd 帮忙监听一个 socket ,以减少资源消耗。当真正有业务连接进来时,才唤醒目标服务。要达成这样的配置,目标服务程序在实现上也有一定要求。

开发一个常规的网络服务,一般有以下几个关键步骤:

1.创建一个 socket

2.调用 bind 将该 socket 绑定一个端口

3.调用 listen 监听端口,将该 socket 变成监听文件描叙符 fd

4.调用 accept 接收一个客户端连接,得到一个新的连接文件描叙符 fd

5.读写连接 socket 的 fd,完成业务逻辑

借助 systemd 强大且通用的服务功能,它可以帮忙完成前两步,并且将 socket 的 fd 传给被激活的程序,后者就只要从第3步开始实现工作。

由socker触发的服务对应于 systemd 的配置文件要有两个,后缀分别是.socket与.service ,除后缀外的文件名要相同,这样就能自动关联,例如名为hello-world-socket的服务:

hello-world-socket.socket

[Unit]Description=Hello World Socket[Socket]ListenStream=0.0.0.0:1234

hello-world-socket.service

[Unit]Description=Hello World Socket Service[Service]ExecStart=/absolute/path/to/hello-world-socket.exe

如上,.socket 的配置,需要有 [Socket] 段,ListenStream 字段表示了要监听 的地址与端口。相应的 .service 配置,与之前例子一样,描叙了如何启动服务。因为这是想由 socket 激活的 service ,故没有配置重启字段。

在 systemctl 的大多数子命令中,如 start ,其参数默认是假定 .service 单元 配置的。例如systemctl start hello-world-socket 等效于 systemctl start hello-world-socket.service 。但在这个例子中,有两种同名单元配置, 且按要求先只启动 hello-world-socket.socket ,所以要写完整的单元名:

systemctlstarthello-world-socket.socket

3.2      定时器触发的服务

对于定时器触发的服务首先要配置一个 .timer 单元文件,例如:

hello-world.timer

[Unit]Description=The Hello-World Timer[Timer]OnCalendar=*-*-* *:*:00

其中,OnCalendar 的配置格式同 crontab ,上例表示每分钟触发。

然后需要一个同名的 .service 单元文件。本文开头编译的 hello-world.exe 正好 可作为该定时器启动的程序,例如:

hello-world.service

[Unit]Description=The Hello-World Timer[Service]Type=oneshotExecStart=/absolute/path/to/hello-world.exeStandardOutput=file:/absolute/path/to/stdout-file

然后启动定时器,并查看状态:

systemctl start hello-world.timersystemctlstatushello-world.timer

4. 服务异常重运行

为了确保服务在遭遇故障时能够自动重启。在Systemd的服务单元文件中,Restart指令是控制服务重启行为的核心设置。本文章将探讨Restart=on-failure与Restart=always这两个选项的区别,帮助开发人员对系统服务做出更适合的选择。Restart指令定义了当服务停止时Systemd的行为。它可以精细控制服务在遇到不同退出情况时是否应该重启。这是确保关键服务可靠性的重要机制,尤其是在生产环境中,服务的持续运行对业务至关重要

4.1           Restart=on-failure:智能重启

当服务单元文件中设置了Restart=on-failure时,Systemd会在服务因错误退出时尝试重启服务。"错误退出"通常是指服务以非零状态码结束运行,这可能是由于程序崩溃、遇到未处理的异常或其他非正常情况导致的。例如,如果你的服务由于内存不足而崩溃,on-failure将确保服务尝试重新启动。但如果服务是由于正常的系统维护任务而被停止,或者开发人员故意停止服务进行调试,那么它将不会被重启。

其应用场景如下:

生产环境:在不希望因为维护或更新操作而自动重启服务的生产环境中使用。

故障排除:当服务可能需要在出现问题时停止,以便进行故障排除时。

有条件的重启:当你只想在服务因特定问题而停止时重启。

4.2      Restart=always:无条件重启

与on-failure相对的是Restart=always选项。不管服务是如何终止的,系统都会尝试将其重启。这意味着即使服务被管理员有意关闭,或者服务正常结束,Systemd也会立即尝试将其重启。

这种策略适用于那些必须始终运行的服务,无论它们是因为何种原因停止的。这确保了即使在进行系统更新或维护时,服务也能尽可能快地恢复运行。

其应用场景如下:

关键服务:对于那些系统的核心功能,如数据库服务或Web服务器,这些服务的任何停机时间都是不可接受的。

高可用性要求:在需要最大程度减少服务停机时间的环境中。

简化管理:在希望无论服务如何停止都能立即重启的情况下。




分享到:
文章列表
RK3576RK3576作为介于RK3568与RK3588之间的工业AI控制SoC,其核心价值在于填补中高端工业控制与边缘AI融合场景之间的性能与成本空档。 在工业数字化与边缘智能加速融合的趋势下,RK3576以工业级实时控制能力与多协议通信支持为基础,同时兼顾AI推理与多媒体处理能力,实现控制可靠性与智能计算能力的协同统一,使其成为连接“确定性控制”与“边缘智能”的关键桥梁型芯片 。RK3...
工业网关开发平台如何选择?从选型标准到RK3506方案解析(下)前言:随着工业物联网(IIoT)的快速发展,工业网关已经成为连接现场设备与云平台的重要桥梁。无论是数据采集、协议转换、边缘计算,还是设备远程运维,工业网关都承担着关键角色。然而,对于设备厂商和方案开发商而言,如何选择一个合适的工业网关开发平台,却并非一件简单的事情。平台选型不仅影响产品开发周期和硬件成本,更关系到设备未来的稳定性...
工业网关开发平台如何选择?从选型标准到RK3506方案解析(上)前言:随着工业物联网(IIoT)的快速发展,工业网关已经成为连接现场设备与云平台的重要桥梁。无论是数据采集、协议转换、边缘计算,还是设备远程运维,工业网关都承担着关键角色。然而,对于设备厂商和方案开发商而言,如何选择一个合适的工业网关开发平台,却并非一件简单的事情。平台选型不仅影响产品开发周期和硬件成本,更关系到设备未来的稳定性...
RK3506工业模组有奖征名活动最终获奖名单来啦!历时多日创意征集,各位伙伴踊跃投稿,经过多轮综合评审,结合产品定位、工业适配度、寓意、传播性四大维度严格筛选。今天正式公布本次RK3506工业模组征名获奖名单!01活动奖品一览 最佳命名奖(1 名)999 足金金条 3枚(1g/枚)优秀创意奖(3 名)999 足金金条 1枚(1g/枚)人气创意奖(10 名)RK3506工业模组或其评估板(J/...
RK3506工业模组有奖征名活动阶段性公示来啦!自征名通道开启以来,我们收到了全国各地工程师、行业从业者的大量创意投稿,每一份名称与释义我们都逐条认真评选。结合产品定位、工业场名称创意、贴合产品属性、传播性综合打分,内部综合评审完成首轮筛选,从中精选出40个优质入围名称,今日统一公示。01本次活动奖品一览 最佳命名奖(1 名)999 足金金条 3g(最终录用名称)优秀创意奖(3 名)999 ...
随着工业设备联网需求不断增长,传统设备面临数据孤岛、远程维护困难以及通信协议不兼容等问题。工业边缘网关作为连接现场设备与云平台的重要节点,正在成为工业物联网系统中的关键基础设施。EG100/EG108工业边缘网关基于RK3506工业平台打造,集成RS232、RS485、双网口、DI/DO以及4G、Wi-Fi、蓝牙等通信能力,可实现工业设备数据采集、协议转换、边缘处理与远程通信。产品支持Lin...
RK3506工业模组:高集成设计如何提升工业物联网开发效率前言在工业物联网快速演进的当下,设备开发者面临着多重技术挑战:硬件设计复杂导致BOM成本居高不下,底层驱动调试耗费大量时间成本,长期运行中的死机与时间同步问题影响系统可靠性,而成本与性能之间的平衡始终难以把握。这些痛点不但延长了产品研发周期,更制约了工业互联方案的规模化落地。万象奥科针对这些行业难题,推出了RK3506系列工业模组,通...
模组案例分享|基于RK3506工业模组7天拿到网关样机导言:答应大家的模组应用案例分享来了!本次分享的是广州农业物联网客户的真实项目案例——基于RK3506工业模组的一款工业网关应用方案。该模组同样适用于数据采集终端等工业场景,能够帮助企业缩短研发周期、精简BOM清单。·案例分享先来看硬件实拍:整板搭载2路以太网、3 路RS485接口,同时预留音频、TF 卡、SIM 卡接口,板载 WiFi、...
前言做产品成本控制,很多人的第一反应是:选一颗更便宜的主控芯片。但算细账的时候发现:主控省了20块钱,外挂的PHY、USB HUB、加密芯片、看门狗、RTC、4G模组、WiFi模组……加起来却多了上百块。而且物料种类多了,采购、库存、生产、测试的成本,以及品控与售后的成本都跟着涨。真正的“省”,不是单颗芯片的便宜,而是系统总成本的降低。以RK3506工业模组为例我们算一笔账01第一笔账:省物...
武汉万象奥科电子有限公司
服务热线:027-59218026
销售邮箱:sales@vanxoak.com
主营产品:ARM核心板、ARM工控板
工业网关、软硬件定制设计
地址:武汉东湖新技术开发区大学园路长城园路8号海容基孵化园B5

扫描二维码
关注公众号
产品及方案咨询
专业专注   合作共赢
移动电话:181 2058 0511 (湖北)
移动电话:175 7010 9551 (华南、华中)
移动电话:133 0386 9667 (华东、华北)