linux守护进程自启动之Systemd -- 入门篇

简述

Systemd用于Linux管理后台服务。通过配置service file可以达到开机自动启动某个服务的目的。通过systemctl等命令集可以控制某个服务是否自启动,也可以对其手动启动或停止。本文简单说明如何实现自启动,并介绍一些基本命令。

服务的自启动

基本原理

在开机时systemd会读取xxx下的配置文件,根据其中的配置项安排守护进程的启动顺序,然后启动这个服务。

【步骤】

  • 用户编写xxx.service文件,放到/lib/systemd/system/目录
  • 执行命令使能自启动systemctl enable xxx.service

Service文件

用ssh.service举个栗子:

[Unit]
Description=OpenBSD Secure Shell server
After=network.target auditd.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run

[Service]
EnvironmentFile=-/etc/default/ssh
ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
ExecReload=/usr/sbin/sshd -t
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
Type=notify
RuntimeDirectory=sshd
RuntimeDirectoryMode=0755

[Install]
WantedBy=multi-user.target
Alias=sshd.service

该Service文件只包含了部分属性,但已经可以清楚的看到Service文件由3个部分组成:Unit, Service, Install

[Unit]

Unit主要描述了守护进程启动的顺序和依赖关系。

[Unit]
Description=OpenBSD Secure Shell server
After=network.target auditd.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run

介绍一些常用字段,全部字段请移步传送门。
Description:对该服务的描述。
After:表示该服务希望在某些服务之后启动,例子中表示在network.target和auditd.service启动后再启动ssh服务。(扩展名是.target的文件我目前理解为其表示一个组服务详细请移步systemd.target 中文手册。
Before:表示该服务希望在某些服务之前启动。
Wants:表示对某些服务的依赖,通常出现在After字段中的服务都会被添加到该字段中。出现在该字段中的服务都会被尽可能的启动,如果其中某个服务不存在或某个服务启动失败,这也不会影响本服务的启动。另外,需要注意的一点是,即便你的服务(A.service)没有使能自启动,但你的服务出现在了其他服务(B.service)的Wants中,那么在启动B.service时也会启动A.service。
Requires:与Wants类似,不同的是如果该字段中的某个服务启动失败则不会启动本服务。
Requisite:与Requires类似,不同的是在启动本服务前,这些服务都必须已经处于启动成功的状态。
ConditionPathExists:表示在后面的路径存在时返回true,这里使用了!非运算符,应该是取反的意思。

[Service]

用于定义当前的服务。

[Service]
EnvironmentFile=-/etc/default/ssh
ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
ExecReload=/usr/sbin/sshd -t
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
Type=notify
RuntimeDirectory=sshd
RuntimeDirectoryMode=0755

介绍一些常用字段,全部字段请移步传送门。
EnvironmentFile:指定当前服务环境参数文件,内部使用键值对定义,可以使用$key读取值,比如ExecStart后面的$SSHD_OPTS。
ExecStartPre:服务启动前执行的命令。
ExecStart:启动服务时执行的命令。
ExecReload:重启服务是执行的命令。
Type:一个比较重要的字段,定义了服务启动的类型。默认值是simple,表示ExecStart 字段启动的进程是主进程。
还有一个常用的是notify,表示程序启动结束后会发出通知,告知systemd本服务已经启动完成。注意,是由我们主动发送的通知,所以要选择合适的时机。
这里插播一段极其简略的sample code。

// 需要包含lib systemd
#include  

void main()
{
	// xxx
	// 资源准备及初始化完成
	sd_notify(0, "READY=1");
}

在sd_notify(0, “READY=1”)调用后使用systemctl status xxx.service查看服务的状态会由starting变成running。
notify是有超时时间的,超时后systemd即判定为服务启动失败。
还有其他的Type在这里不逐个说明了。

[Install]

定义如何安装这个配置文件,即怎样做到开机启动。
介绍一些常用字段,全部字段请移步传送门。
WantedByRequiredBy:表示该服务所在的Target。在使用 systemctl enable 启用此单元时, 将会在每个列表单元的 .wants/ 或 .requires/ 目录中创建一个指向该单元文件的软连接。 这相当于为每个列表中的单元文件添加了 Wants=此单元 或 Requires=此单元 选项。这样当列表中的任意一个单元启动时,该单元都会被启动。
WantedBy=multi-user.target指的是,sshd 所在的 Target 是multi-user.target。systemctl enable sshd.service其实就是将sshd服务的链接放在multi-user.target.wants目录下。同时multi-user.target是系统的默认target,在启动该target的时候,他下面的服务都会开机启动。

常用命令

systemctl命令集

  • 查看服务状态
systemctl status xxx.service
  • 使能服务的自启动
systemctl enable xxx.service  # 重启后生效

使能前:

# systemctl status bluetooth.service
● bluetooth.service - Bluetooth service
     Loaded: loaded (/lib/systemd/system/bluetooth.service; disabled; vendor preset: enabled)
     Active: inactive (dead)
       Docs: man:bluetoothd(8)

使能后:

# systemctl status bluetooth.service
● bluetooth.service - Bluetooth service
     Loaded: loaded (/lib/systemd/system/bluetooth.service; enabled; vendor preset: enabled)
     Active: inactive (dead)
       Docs: man:bluetoothd(8)
  • 取消服务的自启动
systemctl disable xxx.service  # 重启后生效
  • 手动启动服务
systemctl start xxx.service
  • 手动停止服务
systemctl stop xxx.service

部分内容摘自网络,在此表示感谢!如有错误,欢迎指正!

  • https://www.linuxidc.com/Linux/2018-11/155443.htm
  • www.jinbuguo.com/systemd/systemd.index.html
  • https://www.cnblogs.com/q149072205/p/11541693.html

你可能感兴趣的:(嵌入式linux系统,linux,服务器,运维)