- 工信部备案号 滇ICP备05000110号-1
- 滇公安备案 滇53010302000111
- 增值电信业务经营许可证 B1.B2-20181647、滇B1.B2-20190004
- 云南互联网协会理事单位
- 安全联盟认证网站身份V标记
- 域名注册服务机构许可:滇D3-20230001
- 代理域名注册服务机构:新网数码
systemctl 是用于管理 Systemd 系统和服务的命令行工具。Systemd 是一种系统初始化和管理系统进程的工具,被广泛用于现代 Linux 系统。
一、Unit
Systemd 可以管理所有系统资源。不同的资源统称为 Unit(单位),Unit 一共分成12种:
l Service unit:系统服务
l Target unit:多个 Unit 构成的一个组
l Device Unit:硬件设备
l Mount Unit:文件系统的挂载点
l Automount Unit:自动挂载点
l Path Unit:文件或路径
l Scope Unit:不是由 Systemd 启动的外部进程
l Slice Unit:进程组
l Snapshot Unit:Systemd 快照,可以切回某个快照
l Socket Unit:进程间通信的 socket
l Swap Unit:swap 文件
l Timer Unit:定时器
systemctl list-units命令可以查看当前系统的所有 Unit 。
# 列出正在运行的 Unit
$ systemctl list-units
# 列出所有Unit,包括没有找到配置文件的或者启动失败的
$ systemctl list-units --all
# 列出所有没有运行的 Unit
$ systemctl list-units --all --state=inactive
# 列出所有加载失败的 Unit
$ systemctl list-units --failed
# 列出所有正在运行的、类型为 service 的 Unit
$ systemctl list-units --type=service
1.Unit 的状态
# 显示系统状态
$ systemctl status
# 显示单个 Unit 的状态
$ sysystemctl status <service_name>
例:显示linux服务状态:sysystemctl status linux.service
除了status命令,systemctl还提供了三个查询状态的简单方法,主要供脚本内部的判断语句使用:
# 显示某个 Unit 是否正在运行
$ systemctl is-active application.service
# 显示某个 Unit 是否处于启动失败状态
$ systemctl is-failed application.service
# 显示某个 Unit 服务是否建立了启动链接
$ systemctl is-enabled application.service
2. Unit 管理
对于用户来说,最常用的是下面这些命令,用于启动和停止 Unit(主要是 service)。
# 立即启动一个服务
$ sudo systemctl start <service_name>
# 立即停止一个服务
$ sudo systemctl stop <service_name>
# 重启一个服务
$ sudo systemctl restart <service_name>
# 杀死一个服务的所有子进程
$ sudo systemctl kill <service_name>
# 重新加载一个服务的配置文件
$ sudo systemctl reload <service_name>
# 重载所有修改过的配置文件
$ sudo systemctl daemon-reload
# 显示某个 Unit 的所有底层参数
$ systemctl show <service_name>
# 显示某个 Unit 的指定属性的值
$ systemctl show -p CPUShares <service_name>
# 设置某个 Unit 的指定属性
$ sudo systemctl set-property <service_name> CPUShares=500
3.依赖关系
Unit 之间存在依赖关系:A 依赖于 B,就意味着 Systemd 在启动 A 的时候,同时会去启动 B。
systemctl list-dependencies命令列出一个 Unit 的所有依赖。
$ systemctl list-dependencies <service_name>
上面命令的输出结果之中,有些依赖是 Target 类型(详见下文),默认不会展开显示。如果要展开 Target,就需要使用--all参数。
$ systemctl list-dependencies --all <service_name>
二、Unit 的配置文件
1.配置文件的状态
systemctl list-unit-files命令用于列出所有配置文件。
# 列出所有配置文件
$ systemctl list-unit-files
# 列出指定类型的配置文件
$ systemctl list-unit-files --type=service
这个命令会输出一个列表。
$ systemctl list-unit-files
UNIT FILE STATE
chronyd.service enabled
clamd@.service static
clamd@scan.service disabled
这个列表显示每个配置文件的状态,一共有四种。
l enabled:已建立启动链接
l disabled:没建立启动链接
l static:该配置文件没有[Install]部分(无法执行),只能作为其他配置文件的依赖
l masked:该配置文件被禁止建立启动链接
注意,从配置文件的状态无法看出,该 Unit 是否正在运行。这必须执行前面提到的systemctl status命令。
$ systemctl status <service_name>
一旦修改配置文件,就要让 SystemD 重新加载配置文件,然后重新启动,否则修改不会生效。
$ sudo systemctl daemon-reload
$ sudo systemctl restart httpd.service
2.配置文件的格式
配置文件就是普通的文本文件,可以用文本编辑器打开。
systemctl cat命令可以查看配置文件的内容。
# /usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service
[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
从上面的输出可以看到,配置文件分成几个区块。每个区块的第一行,是用方括号表示的区别名,比如[Unit]。注意,配置文件的区块名和字段名,都是大小写敏感的。
每个区块内部是一些等号连接的键值对。
注意,键值对的等号两侧不能有空格.
3.配置文件的区块
[Unit]区块通常是配置文件的第一个区块,用来定义 Unit 的元数据,以及配置与其他 Unit 的关系。它的主要字段如下。
l Description:简短描述
l Documentation:文档地址
l Requires:当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败
l Wants:与当前 Unit 配合的其他 Unit,如果它们没有运行,当前 Unit 不会启动失败
l BindsTo:与Requires类似,它指定的 Unit 如果退出,会导致当前 Unit 停止运行
l Before:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之后启动
l After:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之前启动
l Conflicts:这里指定的 Unit 不能与当前 Unit 同时运行
l Condition...:当前 Unit 运行必须满足的条件,否则不会运行
l Assert...:当前 Unit 运行必须满足的条件,否则会报启动失败
[Install]通常是配置文件的最后一个区块,用来定义如何启动,以及是否开机启动。
[Service]区块用来 Service 的配置,只有 Service 类型的 Unit 才有这个区块。它的主要字段如下。
l Type:定义启动时的进程行为。它有以下几种值。
l Type=simple:默认值,执行ExecStart指定的命令,启动主进程
l Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出
l Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行
l Type=dbus:当前服务通过D-Bus启动
l Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行
l Type=idle:若有其他任务执行完毕,当前服务才会运行
l ExecStart:启动当前服务的命令
l ExecStartPre:启动当前服务之前执行的命令
l ExecStartPost:启动当前服务之后执行的命令
l ExecReload:重启当前服务时执行的命令
l ExecStop:停止当前服务时执行的命令
l ExecStopPost:停止当其服务之后执行的命令
l RestartSec:自动重启当前服务间隔的秒数
l Restart:定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog
l TimeoutSec:定义 Systemd 停止当前服务之前等待的秒数
l Environment:指定环境变量
以Nginx为例,要将通过编译安装的 Nginx 服务设置为通过 systemctl 管理:
a.创建 Nginx 配置文件
首先,创建一个 Nginx 的 Systemd 服务单元配置文件。在 /etc/systemd/system/ 目录下创建一个文件,例如 nginx.service。
b.编辑 Nginx 配置文件
[Unit]
Description=nginx - high performance web server
Documentation=http://www.landui.com/en/docs/
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
请根据你的实际情况调整 ExecStart、ExecReload 和 ExecStop 的路径,确保它们指向正确的 Nginx 可执行文件。
c.加载新的 Systemd 单元配置:
sudo systemctl daemon-reload
d.区块分析
[Unit]
Description=nginx - high performance web server
Documentation=http://www.landui.com/en/docs/
After=network.target
[Unit] 部分: 在这个部分,你可以定义有关服务单元的通用信息。
l Description:服务的描述,用于简要说明服务的用途。
l Documentation:服务的文档链接,提供有关服务的更多信息。
l After:指定服务应该在哪些其他单元之后启动。这里是 network.target,意味着 Nginx 服务将在网络服务启动后启动。
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true
[Service] 部分: 这是定义服务行为的主要部分。
l Type:服务的启动类型。这里设置为 forking,表示该服务会创建一个子进程来运行。
l ExecStart:指定服务启动时执行的命令。这里是 Nginx 可执行文件的路径。
l ExecReload:指定重新加载服务时执行的命令。这里是 Nginx 可执行文件的路径,加上 -s reload 选项以重新加载配置。
l ExecStop:指定停止服务时执行的命令。这里是 Nginx 可执行文件的路径,加上 -s stop 选项以停止服务。
l PrivateTmp:为服务分配私有临时目录。设置为 true,以便为服务创建独立的临时文件系统。
[Install]
WantedBy=multi-user.target
[Install] 部分: 这里指定服务应该在哪个目标单元中启用。
l WantedBy:指定服务应该在哪个目标单元中启用。这里设置为 multi-user.target,表示服务应该在多用户模式下启用。
售前咨询
售后咨询
备案咨询
二维码
TOP