Linux systemd详解

1、概念

1.1 systemd

systemd 是一个用于管理 Linux 系统启动过程和系统服务的系统和服务管理器。它被设计为取代传统的 System V init 系统,提供了更快的启动时间、并行启动服务、更好的日志记录和更强大的管理功能。

1.2 unit 

Unit 是 systemd 中所有配置文件的基本单位,用于描述系统中的各种资源,包括服务、挂载点、设备等。除了 service unit 外,还有其他类型的 unit,如 socket unit、target unit、timer unit 等。每个 unit 都有自己的配置文件,用于定义该资源的属性和行为。

[Unit]
Description=Backup Timer

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target
  • [Unit]:Unit 的基本信息部分。
    • Description:描述该 unit 的用途。
  • [Timer]:Timer unit 的定时器配置部分。
    • OnCalendar:指定定时任务执行的时间表,这里设置为每天执行一次。
    • Persistent:指定即使任务被错过也会保留下次执行的信息。
  • [Install]:指定该 unit 的安装信息。
    • WantedBy:指定该 unit 所属的 target,这里设置为 timers.target。

1.3 Service

Service: 在 systemd 中,service 是一种 unit 类型,用于表示系统中运行的一个服务或进程。每个 service unit 对应一个特定的服务,可以控制该服务的启动、停止、重启等操作。Service unit 文件通常以 .service 为扩展名,定义了服务的启动方式、依赖关系、环境变量等信息。

[Unit]
Description=Backup Service
After=network.target

[Service]
Type=oneshot
ExecStart=/bin/bash /path/to/backup_script.sh

[Install]
WantedBy=multi-user.target
  • [Unit]:Unit 的基本信息部分。
    • Description:描述该 unit 的用途。
    • After:指定该 unit 依赖的其他 unit,在这里表示依赖于网络服务启动完成后再启动。
  • [Service]:Service unit 的服务配置部分。
    • Type:指定服务的类型,这里设置为 one-shot,表示运行一次即退出。
    • ExecStart:指定服务启动时执行的命令。
  • [Install]:指定该 unit 的安装信息。
    • WantedBy:指定该 unit 所属的 target,这里设置为 multi-user.target。

1.4 Target

Target 是一种特殊的 unit,用于组织和管理其他 unit。类似于传统 Linux 系统中的运行级别(runlevel)的概念,不同的 target 可以定义不同的系统状态,如 multi-user.target 表示多用户模式,graphical.target 表示图形界面模式。

[Unit]
Description=Custom Target

[Install]
Alias=custom.target
  • [Unit]:Unit 的基本信息部分。
    • Description:描述该 unit 的用途。
  • [Install]:指定该 unit 的安装信息。
    • Alias:设置别名,这里设置为 custom.target。

2、常用命令

2.1 systemctl start <service>

启动指定的系统服务。例如,启动 Apache 服务:

systemctl start apache2

2.2 systemctl stop <service>

停止指定的系统服务。例如,停止 MySQL 服务:

systemctl stop mysql

2.3 systemctl restart <service>

重启指定的系统服务。例如,重启 Nginx 服务:

systemctl restart nginx

2.4  systemctl status <service>

查看指定系统服务的状态。例如,查看 SSH 服务状态:

systemctl status ssh

  • Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled):这部分显示了服务的加载状态和相关信息。

    • Loaded:表示服务是否已加载。
    • /lib/systemd/system/ssh.service:指示服务单元文件的路径。
    • enabled:表示服务已启用,会在系统启动时自动启动。
    • vendor preset: enabled:表示该设置是由系统供应商预设的。
  • Active: active (running) since Fri 2024-03-22 08:29:44 CST; 1h 12min ago:这部分显示了服务的当前状态。

    • Active:表示服务的活动状态。
    • active (running):表示服务正在运行。
    • since Fri 2024-03-22 08:29:44 CST:表示服务启动的时间。
    • 1h 12min ago:表示服务已经运行了 1 小时 12 分钟。
  • Process: 1240 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS):这部分显示了服务启动前的执行过程。

    • Process: 1240:进程的 ID。
    • ExecStartPre=/usr/sbin/sshd -t:在启动服务之前执行的命令。
    • code=exited, status=0/SUCCESS:表示命令执行成功。
  • Main PID: 1251 (sshd):这部分显示了服务的主进程 ID 和进程名称。

  • Tasks: 1 (limit: 4628):这部分显示了与服务关联的任务数量以及任务限制。

  • CGroup: /system.slice/ssh.service:这部分显示了服务所属的控制组。

  • └─1251 /usr/sbin/sshd -D:这部分显示了服务的主进程及其执行的命令。

2.5 systemctl enable <service>

设置系统服务开机自启动。例如,设置 MariaDB 服务开机自启动:

systemctl enable mariadb

2.6 systemctl disable <service>

取消系统服务开机自启动。例如,取消开机自启动 Postfix 服务:

systemctl disable postfix

2.7 systemctl list-units

列出当前加载的所有单元(包括服务、挂载点、设备等)。例如,列出所有加载的单元:

systemctl list-units

2.8 systemctl daemon-reload

重新加载 systemd 系统配置,使最新的配置生效。通常在修改 systemd 配置后需要运行此命令。

3、测试

3.1 uint格式

名称字段解释示例
UnitDescription描述该 unit 的用途。"Starts the web server"
Documentation指定相关文档的路径。/usr/share/doc/myunit/readme
Requires指定该 unit 依赖的其他 unit(强依赖,依赖启动失败则本身也失败)network.target, mysql.service
Wants指定该 unit 期望依赖的其他 unit(弱依赖)syslog.service, custom.target
Before指定该 unit 应该在哪些 unit 之前启动。network.target, graphical.target
After指定该 unit 应该在哪些 unit 之后启动。multi-user.target, sshd.service
Conflicts指定该 unit 与哪些 unit 冲突。apache.service, nginx.service
OnFailure指定在该 unit 失败时应该启动的其他 unit。rescue.service, alert.target
OnFailureJobMode指定在该 unit 失败时应该采取的操作模式。replace(如果该 unit 失败,将替换为指定的 unit), fail(如果该 unit 失败,将停止所有依赖于它的 unit), isolate(如果该 unit 失败,将进入隔离模式,不再启动其他 unit)
IgnoreOnIsolate指定在隔离模式下是否忽略该 unit。yes, no
ServiceType指定服务的类型,如 simple、forking、oneshot、dbus、notify、idle 等。simple(服务主进程启动后将一直保持运行), forking(服务主进程启动后会创建子进程并立即退出), oneshot(服务用于执行一次性任务,任务完成后服务将自行退出)
ExecStart指定服务启动时执行的命令。/usr/bin/myapp --start
ExecStartPre指定在服务启动前执行的命令。/usr/bin/prestart.sh
ExecStartPost指定在服务启动后执行的命令。/usr/bin/poststart.sh
ExecReload指定重新加载服务时执行的命令。/usr/bin/myapp --reload
ExecStop指定停止服务时执行的命令。/usr/bin/myapp --stop
ExecStopPost指定在服务停止后执行的命令。/usr/bin/poststop.sh
Restart指定服务在失败时是否重启。always, on-success, on-abnormal
RestartSec指定服务重启的时间间隔。30s
TimeoutStartSec指定服务启动的超时时间。5min
TimeoutStopSec指定服务停止的超时时间。1h

Install
 

Alias设置别名,用于创建链接。myservice.service
WantedBy指定该 unit 所属的 target。multi-user.target
RequiredBy指定该 unit 所需的 target。graphical.target

3.2 测试

编写一个service,设置开机自启动,服务执行一个脚本starttime.sh,脚本将当前时间输出到/home/starttime.txt,starttime.sh脚本内容如下:

#!/bin/bash
date +'%Y-%m-%d %H:%M:%S' > /home/starttime.txt

编写服务starttime.service:

[Unit]
Description=Record Start Time to File

[Service]
Type=oneshot
ExecStart=/home/starttime.sh

[Install]
WantedBy=multi-user.target

将服务放到/etc/systemd/system/目录下,将脚本放到/home目录下,修改脚本权限为777,设置开机自启动后重启终端:

查看结果:

4、总结

本文介绍了systemd一些常见的名词概念,介绍了常用的命令和unit的一般格式,最后编写服务进行测试。

  • 29
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值