详细讲解systemctl(附常用指令)

2023-05-16

目录

•写在前面

•systemd和systemctl

•systemd的配置文件目录

•主要服务功能类型

•服务状态

•常用指令

切换系统模式(文本、界面模式等)

•systemctl配置文件的设置


•写在前面

我发现systemctl真的是很有用的东西,感觉使用这个机制可以帮我们解决很多问题,之前没怎么在意这个,现在想着把systemctl这个机制梳理一遍,然后把相关常用的命令整理一下,接下来让我们好好的来理解一下systemctl。

•systemd和systemctl

我们提到systemctl就一定需要知道systemd,因为Linux 服务管理有两种方式service和systemctl。而systemd是Linux系统最新的初始化系统(init),作用是提高系统的启动速度,尽可能启动较少的进程,尽可能更多进程并发启动,systemd对应的进程管理命令就是systemctl。值得一提的是,systemctl命令兼容了service哦。

这里咱们梳理一下systemd这个启动服务管理机制有哪些好处(也就是使用systemctl相关命令的好处啦)。

  • 平行处理所有服务,加速开机流程:旧的init启动脚本(System V的那个)是“一项一项任务依序启动”的模式,因此不相依的服务也是得要一个一个的等待。而systemd可以让所有的服务同时启动,毕竟目前我们的硬件主机系统与操作系统几乎都支持多核心架构,因此你会发现到,系统启动的速度变快了;
  • 一经请求就响应的on-demand启动方式:systemd仅有一只systemd服务搭配systemctl指令进行处理,无须其他额外的指令来支持。不像systemV还要init,chkconfig,service...等等指令。此外,systemd由于常驻内存,因此任何请求(on-demand)都可以立即处理后续的daemon启动的任务;
  • 服务关联性的自我检查:由于systemd可以自行进行服务关联性的检查,因此如果B服务的启动前提是A服务,那当你在没有启动A服务的情况下仅手动启动B服务时,systemd会自动帮你启动A服务;
  • 根据daemon功能分类:systemd旗下管理的服务非常多,为了理清所有服务的功能,因此,首先systemd先定义所有的服务为一个服务单位(这里单位叫“unit”,挺重要的,后面详细说),并将该unit分类到不同的服务类型(type)中。systemd将服务单位(unit)区分为service,socket,target,path,snapshot,timer等多种不同的类型(type);
  • 将多个daemons集合成为一个群组:systemd将许多的功能集合成为一个所谓的target项目,这个项目主要用于设计操作环境的创建,所以集合了许多的daemons(执行某个target就是执行多个daemon);
  • 向下相容旧有的init服务脚本:基本上,systemd是可以兼容init的启动脚本,因此,旧的init启动脚本也能够通过systemd来管理,当然了,这里仅限于不使用systemd的某些高级功能;

•systemd的配置文件目录

  • /usr/lib/systemd/system/:每个服务最主要的启动脚本的配置放在这,有点类似以前的/etc/init.d;
  • /run/systemd/system/:系统执行过程中所产生的服务脚本所在目录,这些脚本的优先级要比/usr/lib/systemd/system/高;
  • /etc/systemd/system/:管理员根据主机系统的需求所创建的执行脚本所在目录,执行优先级比/run/systemd/system/高;

从上面的功能及优先级次序,我们可以知道,/etc/systemd/system/目录下的相关配置,决定系统了会不会执行某些服务,所以该目录下面一般放着一大堆链接文件。而/usr/lib/systemd/system/下,则放着实际执行的systemd启动脚本配置文件。因此如果你想要修改某个服务启动的设置,应该去/usr/lib/systemd/system/下面修改。/etc/systemd/system/仅是链接到正确的执行脚本配置文件而已。所以想要看执行脚本设置,应该就得要到/usr/lib/systemd/system/去查阅。

•主要服务功能类型

.service:一般服务类型(service unit):主要是系统服务,包括服务器本身所需要的本机服务以及网络服务,比较经常被使用到的服务大多是这种类型,所以,这也是最常见的类型。

.socket:内部程序数据交换的插槽服务(socketunit):主要是IPC(Inter-processcommunication)的传输信息插槽(socketfile)功能。这种类型的服务通常在监控信息传递的插槽档,当有通过此插槽传递信息请求链接服务的时候,就依据当时的状态将该用户的请求传送到对应的daemon,若daemon尚未启动,则启动该daemon后再传送用户的请求。使用socket类型的服务一般是比较不会被用到的服务,因此在开机时通常会稍微延迟启动的时间。一般用于本机服务比较多,例如我们的图形界面很多的软件都是通过socket来进行本机程序数据交换的行为。

.target:执行环境类型(target unit):其实是一群unit的集合,例如multi-user.target其实就是一堆服务的集合。

.mount:文件系统挂载相关的服务(automount unit/mount unit):例如来自网络的自动挂载、NFS文件系统挂载等与文件系统相关性较高的程序管理。

.path:监测特定文件或目录类型(path unit):某些服务需要监测某些特定的目录来提供序列服务,例如最常见的打印服务,就是通过监测打印序列目录来启动打印功能。这时就得要.path的服务类型支持。

.timer:循环执行的服务(timer unit):这个东西有点类似anacrontab,不过是由systemd主动提供的,比anacrontab更加有弹性。

•服务状态

这里我们可以先试用下面这个指令查看一下atd服务的当前状态,指令和结果如下:

systemctl status atd.service
   
   

看到高亮的那个没有,这就是当前服务的状态。那么服务有哪几种常见的状态呢,这里列举说明一下。

  • active(running):正有一只或多只程序正在系统中执行的意思;
  • active(exited):仅执行一次就正常结束的服务,目前并没有任何程序在系统中执行;
  • active(waiting):正在执行当中,不过还需要等待其他的事件才能继续处理;
  • inactive:这个服务目前没有运行;
  • dead:程序已经清除;

上面是运行结果中,我圈出了一个地方,那个是啥?那个其实是这只服务程序的启动状态,也分为一下几种状态。

  • enabled:这个daemon将在开机时被执行;
  • disabled:这个daemon在开机时不会被执行;
  • static:这个daemon不可以自己启动(enable不可),不过可能会被其他的enabled 的服务来唤醒(关联属性的服务);
  • mask:这个daemon无论如何都无法被启动,因为已经被强制注销(非删除),可通过systemctlunmask方式改回原本状态;

•常用指令


   
   
  1. systemctl #范列出系统上面有启动的unit
  2. systemctl list-unit-files #列出所有已经安装的unit有哪些
  3. systemctl list-units -- type=service --all #列出类型为service的所有项目,不论启动与否
  4. systemctl get-default #输入目前机器默认的模式,如图形界面模式或者文本模式
  5. systemctl isolate multi-user.target #将目前的操作环境改为纯文本模式,关掉图形界面
  6. systemctl isolate graphical.target #将目前的操作环境改为图形界面
  7. systemctlpoweroff #系统关机
  8. systemctl reboot #重新开机
  9. systemctl suspend #进入暂停模式
  10. systemctl rescue #强制进入救援模式
  11. systemctl hibernate #进入休眠模式
  12. systemctl emergency #强制进入紧急救援模式
  13. systemctl list-dependencies --reverse #查询当前默认的target关联了啥
  14. systemctl list-dependencies graphical.target #查询图形界面模式的target关联了啥
  15. systemctl list-sockets #查看当前的socket服务
  16. systemctl show etcd.service #查看 unit 的详细配置情况
  17. systemctl mask etcd.service #禁用某个服务
  18. systemctl unmask etcd.service #解除禁用某个服务

切换系统模式(文本、界面模式等)

这里我想特别提一下跟操作界面比较有关的target项目,毕竟常用的模式target有以下几种:

  • graphical.target:就是文字加上图形界面,这个项目已经包含了下面的multi-user.target项目;
  • multi-user.target:纯文本模式;
  • rescue.target:在无法使用root登陆的情况下,systemd在开机时会多加一个额外的暂时系统,与你原本的系统无关。这时你可以取得root的权限来维护你的系统。但是这是额外系统,因此可能需要动到chroot的方式来取得你原有的系统;
  • emergency.target:紧急处理系统的错误,还是需要使用root登陆的情况,在无法使用rescue.target时,可以尝试使用这种模式;
  • shutdown.target:就是关机的流程;
  • getty.target:可以设置你需要几个tty之类的,如果想要降低tty的项目,可以修改这个东西的配置文件;

•systemctl配置文件的设置

这里我们先查看一下service里面的内容,随便找了一个内容比较多的sshd.service,方便讲解,指令结果如下:

分析上面的配置文件,我们大概能够将整个设置分为三个部份,就是:

  • [Unit]:unit本身的说明,以及与其他相关联daemon的设置,包括在什么服务之后才启动此unit之类的设置值;
  • [Service],[Socket],[Timer],[Mount],[Path]等等:不同的unit type就得要使用相对应的设置项目,我们拿的是sshd.service来举例,所以这边就使用[Service]来设置。这个项目内主要在规范服务启动的脚本、环境配置文件文件名、重新启动的方式等等;
  • [Install]:这个项目就是将此unit安装到哪个target里面去;

至于配置文件内有些设置规则还是得要说明一下:

  • 设置项目通常是可以重复的,例如我可以重复设置两个After在配置文件中,不过,后面的设置会取代前面的,因此,如果你想要将设置值归零,可以使用类似“After=”的设置,即该项目的等号后面什么都没有,就将该设置归零了(reset);
  • 如果设置参数需要有“是/否”的项目(布尔值,boolean),你可以使用1,yes,true,on代表启动,用0,no,false,off代表关闭!随你喜好选择;
  • 空白行、开头为#或;的那一行,都代表注解;

每个部份里面还有很多的设置细项,我们使用一个简单的表格来说明每个项目好了。

[Unit]部分
设置参数
参数意义说明
Description
就是当我们使用 systemctllist-units 时,会输出给管理员看的简易说明,当然,使用systemctlstatus 输出的此服务的说明,也是这个项目。
Documentation
这个项目在提供管理员能够进行进一步的文件查询的功能,提供的文件可以是如下的数据:Documentation=http://www....
After
说明此 unit 是在哪个 daemon 启动之后才启动,基本上仅是说明服务启动的顺序而已,并没有强制要求里面的服务一定要启动后此unit才能启动。以 sshd.service 的内容为例,该文件提到 After 后面有network.target 以及 sshd-keygen.service ,但是若这两个 unit 没有启动而强制启动sshd.service 的话,那么 sshd.service 应该还是能够启动的,这与Requires 的设置是有差异的。
Before
与 After 的意义相反,是在什么服务启动前最好启动这个服务。不过这仅是规范服务启动的顺序,并非强制要求。
Requires
明确的定义此 unit 需要在哪个 daemon 启动后才能够启动,就是设置服务的关联性,如果在此项设置的前导服务没有启动,那么此unit 就不会被启动。
Wants
与 Requires 刚好相反,规范的是这个 unit 之后最好还要启动什么服务,不过,并没有明确的规范,主要的目的是希望创建让使用者比较好操作的环境。因此,这个Wants后面接的服务如果没有启动,其实不会影响到这个unit 本身。
Conflicts
代表冲突的服务,即这个项目后面接的服务如果有启动,那么我们
这个 unit 本身就不能启动,我们 unit 有启动,则此项目后的服务就不
能启动,就是冲突性的检查。
[Service] 部份
设置参数
参数意义说明
Type
说明这个 daemon 启动的方式,会影响到 ExecStart, 一般来说,有下面几种类型:
simple :默认值,这个 daemon 主要由 ExecStart 接的指令串来启动,启动后常驻于内存中。
forking :由 ExecStart 启动的程序通过spawns 延伸出其他子程序来作为此 daemon 的主要服务。原生的父程序在启动结束后就会终止运行。传统的unit 服务大多属于这种项目,例如httpd 这个 WWW 服务,当 httpd 的程序因为运行过久因此即将终结了,则systemd 会再重新生出另一个子程序持续运行后,再将父程序删除。
oneshot :与simple 类似,不过这个程序在工作完毕后就结束了,不会常驻在内存中。
dbus :与 simple 类似,但这个 daemon 必须要在取得一个D-Bus的名称后,才会继续运行!因此设置这个项目时,通常也要设置BusName= 才行!
idle :与 simple 类似,意思是,要执行这个daemon必须要所有的工作都顺利执行完毕后才会执行。这类的 daemon通常是开机到最后才执行即可的服务!比较重要的项目大概是simple,forking 与 oneshot 了!毕竟很多服务需要子程序(forking ),而有更多的动作只需要在开机的时候执行一次(oneshot ),例如文件系统的检查与挂载啊等等的。
 
EnvironmentFile
可以指定启动脚本的环境配置文件!例如 sshd.service 的配置文件写入到/etc/sysconfig/sshd 当中!你也可以使用 Environment= 后面接多个不同的Shell 变量来给予设置!
ExecStart
可以指定启动脚本的环境配置文件!例如 sshd.service 的配置文件写入到/etc/sysconfig/sshd 当中!你也可以使用 Environment= 后面接多个不同的Shell 变量来给予设置!
ExecStop
与 systemctlstop 的执行有关,关闭此服务时所进行的指令。
ExecReload
与 systemctlreload 有关的指令行为
Restart
当设置 Restart=1 时,则当此 daemon 服务终止后,会再次的启动此服务。举例来说,如果你在tty2 使用文字界面登陆,操作完毕后登出,基本上,这个时候tty2 就已经结束服务了。但是你会看到屏幕又立刻产生一个新的tty2 的登陆画面等待你的登陆!那就是 Restart的功能!除非使用systemctl 强制将此服务关闭,否则这个服务会源源不绝的一直重复产生!
RemainAfterExit
当设置为 RemainAfterExit=1 时,则当这个 daemon 所属的所有程序都终止之后,此服务会再尝试启动。这对于Type=oneshot 的服务很有帮助!
TimeoutSec
若这个服务在启动或者是关闭时,因为某些缘故导致无法顺利 “ 正常启动或正常结束” 的情况下,则我们要等多久才进入 “ 强制结束 ” 的状态!
KillMode
可以是 process,control-group,none 的其中一种,如果是 proces则daemon 终止时,只会终止主要的程序( ExecStart 接的后面那串指令),如果是control-group 时,则由此 daemon 所产生的其他control-group的程序,也都会被关闭。如果是 none 的话,则没有程序会被关闭喔!
RestartSec
与 Restart 有点相关性,如果这个服务被关闭,然后需要重新启动时,大概要sleep 多少时间再重新启动的意思。默认是 100ms (毫秒)。
[Install]部份
设置参数
参数意义说明
WantedBy
这个设置后面接的大部分是 *.targetunit !意思是,这个 unit 本是附挂在哪一个targetunit 下面的!一般来说,大多的服务性质 unit 都是附挂在multi-user.target下面!
Also
当目前这个 unit 本身被 enable 时, Also 后面接的 unit 也请 enable。 也就是具有相依性的服务可以写在这里。
Alias
进行一个链接的别名的意思!当 systemctlenable 相关的服务时则此服务会进行链接文件的创建!以multi-user.target 为例,这个伙是用来作为默认操作环境default.target 的规划,因此当你设置成 default.target时,这个/etc/systemd/system/default.target 就会链接到/usr/lib/systemd/system/multi-user.target。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

详细讲解systemctl(附常用指令) 的相关文章

随机推荐

  • java通过模板导出excel的一个实例

    写之前 xff0c 大家请先下好poi的相关jar包 xff0c 网上遍地都是 xff0c 不多说 lt input type 61 34 button 34 id 61 34 exportBtn 34 class 61 34 Common
  • Android源码学习之六——ActivityManager框架解析

    ActivityManager 在操作系统中有重要的作用 xff0c 本文利用操作系统源码 xff0c 逐步理清 ActivityManager 的框架 xff0c 并从静态类结构图和动态序列图两个角度分别进行剖析 xff0c 从而帮助开发
  • Oracle 排序中使用nulls first 或者nulls last 语法

    Nulls first和nulls last是Oracle Order by支持的语法 如果Order by 中指定了表达式Nulls first则表示null值的记录将排在最前 不管是asc 还是 desc 如果Order by 中指定了
  • javascript怎么清空一个div里面的内容

    document getElementById 39 BIGDraw 39 innerHTML 61 34 34 39 BIGDraw 39 html 34 34 清空div内容 两种都可以
  • POI操作Excel:隐藏、删除Excel中指定的Sheet

    使用POI操作Excel时如何隐藏 删除Excel中指定的Sheet呢 xff1f 在POI的API中的HSSFWorkbook类提供了相关的方法 xff0c xff08 1 xff09 隐藏Sheet xff1a setSheetHidd
  • freemarker大于,小于 gt,lt 的用法

    freemarker里面不能包含 gt lt 所以要用到大于和小于 就要用gt lt gt是大于 lt是小于 代码如下 lt if content length gt 100 gt content 0 100 lt else gt cont
  • 当oracle clob类型不能和group by并用,但是需要去除多列重复

    当oracle clob类型不能和groupby并用 xff0c 但是需要去除多列重复 xff0c 请不要急 xff01 直接看SQL xff1a SELECT T MEMBER T HTEST T ACCEPTDATE T TASKMEM
  • swagger多个分组代码展示

    swagger分组示例 span class hljs annotation 64 Configuration span span class hljs annotation 64 EnableWebMvc span span class
  • 51单片机与AVR单片机

    51单片机与AVR单片机 区别于不同 区别于不同 51单片机本身种类繁多 xff0c 各种国产变种 xff0c 增强型51等等 他们都是INTEL的80C51内核 xff0c 经典但是老 51单片机到底是哈弗还是冯诺依曼 xff0c 众说纷
  • 电脑休眠、睡眠、待机的区别

    电脑休眠 xff08 Hibernate xff09 将系统切换到该模式后 xff0c 系统会自动将内存中的数据全部转存到硬盘上一个休眠文件中 xff0c 然后切断对所有设备的供电 这样当恢复的时候 xff0c 系统会从硬盘上将休眠文件的内
  • android的OnClick注解无效情况之一

    例子 当使用了 64 OnClick 注解 xff0c 貌似控件不用设置setOnClickListener this 监听了 xff0c 否则会干扰到这个注解无效 xff0c span class token comment 重置数据 s
  • androidStudio不能run运行,显示Loading devices...

    问题示图 试了n种解决方案 1 Clean project 再Rebuild project 2 点击File然后Invalidate andRestart 重启AndroidStudio并清理缓存 3 重启电脑 或者关机再开机 试了常用的
  • 探索Android中的Parcel机制(上)

    一 xff0e 先从 Serialize 说起 我们都知道 JAVA 中的 Serialize 机制 xff0c 译成串行化 序列化 xff0c 其作用是能将数据对象存入字节流当中 xff0c 在需要时重新生成对象 主要应用是利用外部存储设
  • Android动态获取手机是否是充电状态

    参考谷歌官方文档 https developer android google cn topic performance power 一 获取充电状态 在应用中执行某些操作 如软件云端备份 从服务器端获取最新版本号 从服务器端缓存最新软件安
  • EF_Using(问题)

    xfeff xfeff using 语句中使用的类型必须可隐式转换为 System IDisposable using 语句中使用的类型必须可隐式转换为 System IDisposable 在使用 EF 出现 using 语句中使用的类型
  • 100个不能错过的实用JS自定义函数

    1 原生JavaScript实现字符串长度截取 代码如下 span class token keyword function span span class token function cutstr span span class tok
  • Android.mk 编译报错undefined reference to

    当出现 undefined reference to xxx时 xff0c 对应的lib库已经添加到LOCAL STATIC LIBRARIES里面 xff0c 且 头文件已经已经添加时 xff0c 仍然报 undefined refere
  • yocto QT5 QSqlDatabase: QSQLITE driver not loaded

    yocto中默认编译出来的qt是不带有sql driver xff0c 即缺少插件库libqsqlite so 修改位置 xff1a 1 在xx meta qt5 recipes qt qt5 qtbase git bb中 xff0c 修改
  • systemd 介绍

    转自 xff1a https www linuxidc com Linux 2018 03 151291 htm 从 init 系统说起 Linux 操作系统的启动首先从 BIOS 开始 xff0c 接下来进入 boot loader xf
  • 详细讲解systemctl(附常用指令)

    目录 写在前面 systemd和systemctl systemd的配置文件目录 主要服务功能类型 服务状态 常用指令 切换系统模式 xff08 文本 界面模式等 xff09 systemctl配置文件的设置 写在前面 我发现systemc