systemctl命令详解

2023-08-25 18:29:04 2473

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命令可以查看配置文件的内容。

 

$ systemctl cat sshd.service

 

# /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,表示服务应该在多用户模式下启用。


提交成功!非常感谢您的反馈,我们会继续努力做到更好!

这条文档是否有帮助解决问题?

非常抱歉未能帮助到您。为了给您提供更好的服务,我们很需要您进一步的反馈信息:

在文档使用中是否遇到以下问题: