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  <systemd/sd-daemon.h>

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
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Linux守护进程,也称为后台进程或服务进程,是一种在系统启动后持续运行并执行特定任务的程序。它们通常不会因为用户会话结束而关闭,即使用户注销或系统重启,这些进程也会继续运行。 在Linux中,让一个程序以守护进程的方式启动主要有以下几种方法: 1. **使用init或systemd**:Linux传统的初始化系统init(现在大多数发行版使用systemd)提供了`start`、`stop`、`restart`等命令来控制服务。在`/etc/init.d`目录下有对应的脚本文件,如`myservice.sh`,通过`sudo service myservice start`命令启动。 2. **systemctl**: 对于systemd系统,可以在`/etc/systemd/system`目录创建或编辑服务单元文件(如`myservice.service`),然后用`sudo systemctl start myservice`启动,或在`systemctl`命令行工具中使用更灵活的选项。 3. **cron jobs**:通过定时任务计划器cron,可以设置守护进程在特定时间或周期性地执行。 4. **写入rc.local或类似文件**:在系统的启动脚本中,如`/etc/rc.local`,添加守护进程启动的命令。 5. **环境变量**:有些服务可能会设置环境变量,如`DAEMON`或`PIDFILE`,用于指示其为守护进程运行,并提供进程ID供管理。 为了确保守护进程能在系统重启后自动启动,通常会在启动脚本的末尾加上`exit 0`(表示成功启动)或在systemd服务文件中设置`After=network.target`(等待网络服务启动后启动)。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值