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格式

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

相关推荐
梅见十柒18 分钟前
wsl2中kali linux下的docker使用教程(教程总结)
linux·经验分享·docker·云原生
Koi慢热21 分钟前
路由基础(全)
linux·网络·网络协议·安全
传而习乎31 分钟前
Linux:CentOS 7 解压 7zip 压缩的文件
linux·运维·centos
我们的五年41 分钟前
【Linux课程学习】:进程程序替换,execl,execv,execlp,execvp,execve,execle,execvpe函数
linux·c++·学习
IT果果日记1 小时前
ubuntu 安装 conda
linux·ubuntu·conda
Python私教1 小时前
ubuntu搭建k8s环境详细教程
linux·ubuntu·kubernetes
羑悻的小杀马特1 小时前
环境变量简介
linux
小陈phd2 小时前
Vscode LinuxC++环境配置
linux·c++·vscode
是阿建吖!2 小时前
【Linux】进程状态
linux·运维
明明跟你说过2 小时前
Linux中的【tcpdump】:深入介绍与实战使用
linux·运维·测试工具·tcpdump