linux systemctl命令详解

linux systemctl命令详解

本文主要介绍linux systemctl命令的详细说明。边肖认为这很好。现在分享给大家,给大家一个参考。来和边肖一起看看吧。

在上一篇文章中,作者简要介绍了systemd的基本概念和主要特征。因为与systemd相关的大多数任务都是由systemctl命令管理的,所以本文将重点介绍systemctl命令的用法。注意,本文是在ubuntu 16.04中引入的,本文中的所有演示都是在ubuntu 16.04中完成的。

systemctl命令有两种功能:

控制系统

管理系统上运行的服务。

在介绍这些函数之前,我们先预热一下,了解一下systemctl命令本身的一些信息。

预热

检查systemd的版本。

$ systemctl -版本

检查与systemd和systemctl程序相关的目录。

systemd在哪里

systemctl在哪里

确认 1 号进程

作为一个init系统,systemd进程是系统中的头号进程应该是毫无疑问的。让我们搜索与systemd相关的进程:

结果,人们简直不敢相信自己的眼睛。我们搜索了与systemd相关的几个进程,但是没有1个进程。让我们看看谁是进程1:

/sbin/init是什么?

嗯,/sbin/init只是一个到/lib/systemd/systemd的链接文件,系统的一号进程确实是systemd,但在ubuntu中却命名为/sbin/init。

管理单个 unit

Systemctl提供了一组子命令来管理单个单元。它的命令格式是:

系统指令

命令主要包括:

启动:立即启动下面的单元。

停止:立即关闭下面的单元。

重启:立即关机并启动后面的单元,即停止并重新启动。

重新加载:重新加载配置文件,使设置在不关闭设备的情况下生效。

启用:设置下一次开机时启动下一台机组。

Disable:设置下一个单元在下次打开时不会启动。

状态:下面这个单元目前的状态会列出是否运行,启动时是否启动等信息。

Is-active:它当前是否正在运行?

Is-enable:这个单元在引导时默认启用吗?

Kill:不要被kill这个名字吓到,它其实是向进程运行单元发出一个信号。

显示:列出单元的配置。

屏蔽:注销该单元。注销后,您无法启动本设备。

Unmask:注销设备。

我们先通过prometheus.service观察一下服务类型单元的基本信息:

输出的第一行是单元的基本描述。

第二行Loaded描述操作系统启动时是否会启动服务,enabled表示启动,disabled表示启动时不启动。而启动这个服务的配置文件路径是:/lib/systemd/system/Prometheus . service。

第三行中的Active描述了服务的当前状态,active(正在运行)表示服务正在运行。如果它是非活动的(死的),则服务当前没有运行。随后是服务的开始时间。

第四行的Docs提供了在线文档的地址。

下面的主PID代表进程的ID,后面是任务数,占用的内存和CPU资源。

以下cgroup描述了与Cgroup相关的信息,作者将在后续文章中详细介绍。

最后,输出日志信息。

关于机组的启动状态,除了启用和禁用,还有:

静态:该单元不能自行启动,但可能被其他已启用的服务唤醒。

面具:这个单元无论如何都启动不了!因为它已被强制注销。可以通过systemctl unmask把它改回原来的状态。

关于单元的运行状态,除了活动和非活动之外,还有:

Active(现有):仅执行一次后就正常结束的服务。目前,系统中没有执行任何程序。比如开机或挂载时只能执行一次的quotaon功能就是这种模式!Quotaon不需要一直执行。在它只被执行一次之后,它将被交给文件系统进行自我处理。通常,用bash shell编写的小服务就属于这种类型。

Active (waiting):正在执行,但是我们必须等待其他事件才能继续处理。比如打印相关服务就是这种状态。

enable 和 disable 操作

例如,我们为prometheus服务创建了配置文件/lib/systemd/system/Prometheus . service,然后执行了enable命令:

$ sudo systemctl启用prometheus.service

所谓启用就是在multi-user.target.wants下创建一个链接文件:

它链接到multi-user.target.wants目录的原因是由prometheus.server文件中的配置信息决定的。

查看 unit 的配置

使用show子命令查看设备的详细配置:

$ sudo system CTL show Prometheus . service

这里有很多输出,主要是因为还显示了很多默认设置。

注销与反注销 unit

如果我们想暂时禁用某个单元,如prometheus.service,我们可以注销该单元。注销后,我们无法再次启动此服务:

$ sudo system CTL mask Prometheus . service

从上图的输出中我们可以看到,所谓的注销就是将prometheus.service文件链接到空的device /dev/null。因此,该服务无法再启动。让我们尝试执行反注销:

$ sudo system CTL unmask Prometheus . service

取消屏蔽操作是删除屏蔽操作中创建的链接。

查看系统上的 unit

Systemctl提供子命令来查看系统上的单元。命令格式是:

system CTL[命令] [ - type=TYPE] [ - all]

命令具有:

List-units:列出当前已经启动的单元。如果添加了-all选项,还将列出尚未启动的设备。

List-unit-files:根据/lib/systemd/system/目录中的文件列出所有单元。

- type=TYPE:可以过滤某种类型的单元。

执行不带任何参数的systemctl命令将列出所有已启动的单元:

系统中默认启动的服务有很多,上图只截取了前几行。以下是对输出的介绍:

单位:项目名称,包括每个单位的类别(见扩展名)。

LOAD:启动时是否加载单元的配置。

主动:当前状态必须与后续sub匹配!当我们用systemctl状态观察它时,它是活动内容。

描述:描述信息。

注意不带参数的systemctl实际上等同于systemctl list-units!

让我们看看系统上安装了多少个单元:

$ sudo systemctl列表-单元-文件

结果很多,我们还是只截取了一部分。这里的状态是我们前面介绍的服务的启动状态,包括启用和禁用、静态和屏蔽。

只查看某种类型的 unit

例如,我们只想查看服务单元类型:

$ system CTL list-units-type=service-all

只有结尾是。这次服务会出现。

如果想看mount type - type=mount的单位规格,也可以:

查看加载失败的 unit

如果您发现某个单元不工作,您可以检查是否有任何单元加载失败:

$ systemctl -失败

管理不同的操作环境(target unit)

通过指定- type=target,可以使用systemctl list-units命令来查看默认情况下系统中有多少种目标:

我ubuntu 16.04里居然有27个目标!这里我们只介绍几个常用的目标。

Graphical.target:文本界面加上图形界面。此目标已经包含以下多用户。目标

多用户。目标:纯文本模式!

Rescue.target:当你无法用root登录时,systemd会在你开机时额外添加一个临时系统,这个临时系统和你原来的系统没有任何关系。这时候你就可以获得root的权限来维护你的系统了。

Emergency.target:紧急处理系统错误,无法使用rescue.target时尽量使用该模式!

关机目标:执行关机。

Getty.target:可以设置tty的配置。

正常模式是multi-user.target和graphical.target,救援模式主要是rescue.target和更严重的emergency.target,如果要修改可以提供登录的tty数量,修改getty.target

以下是操作目标单元命令的格式:

系统命令

命令具有:

Get-default:获取当前目标。

Set-default:将以下目标设置为默认操作模式。

隔离:切换到以下模式。

查看和设置默认的 target

$ sudo systemctl get-default

系统的默认目标是graphical.target,所以启动时默认启动图形界面。让我们将它设置为多用户。目标如下:

$ sudo system CTL set-默认多用户. target

实际的执行过程是删除之前的链接文件,然后新建一个链接文件到/lib/systemd/system/multi-user . target,这样,下次开机的时候默认进入纯文本模式。

切换 target

我们还可以在不重启情况下切换不同的目标,例如从图形界面切换到纯文本模式:

$ sudo systemctl隔离多用户. target

一般来说,你可以通过使用上面的隔离方法在不同的目标之间切换。然而,为了方便起见,systemd还提供了

几个简单的指令用于切换操作模式,大致如下:

$ sudo systemctl poweroff #系统关机

$ sudo systemctl reboot # reboot

$ sudo systemctl suspend #进入暂停模式

$ sudo systemctl hibernate #进入睡眠模式

$ sudo systemctl rescue #强制进入救援模式

$ sudo systemctl emergency #强制进入紧急救援模式

下面简单介绍一下暂停模式和睡眠模式的区别。

挂起:挂起模式会将系统的状态保存到内存中,然后关闭大部分系统硬件。当然,并没有实际关机。当用户按下按钮唤醒机器时,会从内存中恢复系统数据,然后重新驱动大部分关闭的硬件,这样唤醒系统更快。

休眠:休眠模式是将系统状态保存到硬盘。保存后,关闭电脑。当用户试图唤醒系统时,系统将开始正常运行,然后保存在硬盘中的系统状态将被恢复。因为需要从硬盘中读取数据,所以唤醒速度较慢(如果使用SSD盘,唤醒速度也很快)。

检查 unit 之间的依赖性

很多服务都有依赖关系,systemd的一大亮点就是可以管理单元之间的依赖关系。我们可以通过以下命令检查单元之间的依赖关系:

system CTL List-dependencies[unit][-reverse]选项-reverse将追溯谁在使用这个单元。

让我们看看当前运行的目标的依赖关系:

我们目前运行在graphical.target下,它由一长串依赖项组成(上图中并未显示所有项),其中最重要的一项是multi-user.target,我们用- reverse选项来看看谁使用了multi-user.target unit:

$ systemctl list-dependencies多用户. target - reverse

从上面两张图,我们可以确定如下关系:graphical.target依赖于multi-user.target。

这里只介绍如何通过目标单元检查单元之间的依赖关系。在实际使用中,我们主要检查服务单元之间的依赖关系。

相关的目录和文件

在不同的发行版中,与systemd相关的文件路径可能不同。为了强调,本文介绍ubuntu 16.04。

/lib/systemd/system/单元的大多数配置文件都放在这个目录中。

/run/systemd/system/系统运行过程中生成的脚本,如用户相关脚本、会话相关脚本等。

/etc/systemd/system/这个目录下的主文件都是指向/lib/systemd/system/目录的链接文件。

注意,当我们自己创建单元配置文件时,我们可以将配置文件放在/lib/systemd/system/目录或/etc/systemd/system/目录中。

/etc/default/许多服务默认配置文件都放在这个目录中。

/var/lib/有些生成数据的服务会将其数据写入/var/lib/目录。例如,docker相关的数据文件就放在这个目录中。

/run/这个目录包含了很多服务运行时的临时数据,比如锁文件,PID文件等等。

我们知道systemd管理着很多会使用原生socket的服务,所以系统中肯定会有很多socket文件。那么,这些socke文件都存储在哪里呢?我们可以使用systemctl来检查:

$ systemctl列表-套接字

实际上,大多数套接字文件都存储在/run目录及其子目录中。

systemctl daemon-reload 子命令

Daemon-reload是一个很容易被误用的子命令,主要是因为其名称中包含的单词Daemon很容易将其与reload子命令混淆。

我们简要介绍了reload子命令,它用于重新加载服务程序的配置文件。这里的程序是指服务类型单元的配置中指定的程序,通常称为daemon(提供某种服务的应用程序)。比如服务类型的unit prometheus.service,提供服务的守护程序在我的机器上是/usr/local/share/prometheus/Prometheus,所以reload子命令重新加载Prometheus的配置文件。

如果daemon-reload子命令中的守护进程被理解为systemd程序,则该命令可以解释为重新加载systemd程序的配置文件。所有单元配置文件都以systemd程序配置文件的形式存在。这个结论是:

添加新的设备配置文件需要daemon-reload子命令。

当单元的配置文件改变时,也需要执行daemon-reload子命令。

daemon-reload命令会做很多事情,其中一个就是重新生成依赖关系树(也就是单元之间的依赖关系),所以在修改单元配置文件中的依赖关系后,如果不执行daemon-reload命令就不会生效。

如果想对linux命令有更系统更深入的学习,可以参考经典书籍《Linux命令速查手册PDF中文第3版》。

总结

Systemctl提供了许多子命令来管理systemd和系统服务。本文仅简要介绍主要子命令和一些常见用法。对于如此庞大的命令集,我相信只有通过不断的练习才能真正掌握它们。

这就是本文的全部内容。希望对大家的学习有帮助,支持我们。

linux systemctl命令详解