本文主要介绍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和系统服务。本文仅简要介绍主要子命令和一些常见用法。对于如此庞大的命令集,我相信只有通过不断的练习才能真正掌握它们。
这就是本文的全部内容。希望对大家的学习有帮助,支持我们。