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" |
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 | |
Service | Type | 指定服务的类型,如 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的一般格式,最后编写服务进行测试。