systemd系统守护进程的操作命令

目录

systemd #system daemon系统守护进程

unit:单元

Target Unit说明

systemd中unit配置目录、文件说明

总结以及注意事项

chkconfig,service查询服务


systemd #system daemon系统守护进程

一、由来

历史上,Linux 的启动一直采用init进程。

下面的命令用来启动服务。

  1. /etc/init.d/apache2 start或者service apache2 start

这种方法有两个缺点。

  1. 启动时间长。init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。
  2. 启动脚本复杂。init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长。

二、Systemd 概述

Systemd 就是为了解决这些问题而诞生的。它的设计目标是,为系统的启动和管理提供一套完整的解决方案。

根据 Linux 惯例,字母d是守护进程(daemon)的缩写。 Systemd 这个名字的含义,就是它要守护整个系统。

使用了 Systemd,就不需要再用init了。Systemd 取代了initd,成为系统的第一个进程(PID 等于 1),其他进程都是它的子进程。

  1. systemctl --version

上面的命令查看 Systemd 的版本。

Systemd 的优点是功能强大,使用方便,缺点是体系庞大,非常复杂。事实上,现在还有很多人反对使用 Systemd,理由就是它过于复杂,与操作系统的其他部分强耦合,违反"keep simple, keep stupid"的Unix 哲学。

三、systemd可以管理所有系统资源,不同的资源统称为unit(单元,单位,组件,部件等解释),可以把linux启动后所运行的每个程序当成一个unit来看。如果想要控制systemd下的各种Unit,则可使用systemctl命令,详细用法如此链接:systemctl命令用法.note

unit:单元

unit分为service,socket,target,path,snapshot,timer等多种不同的类型(type)以下是12中Unit Type

  1. .service unit #用于启动和控制守护进程以及他们所包含的进程
  2. .socket nuit #进程间通信的socket
  3. target nuit #是一群unit的集合
  4. device unit #硬件设备
  5. mount unit #文件系统挂载点
  6. automoount unit #自动挂载点
  7. timer unit #定时器
  8. swap unit #关于swap文件
  9. snapshot unit #关于systemd快照,可以切回某个快照
  10. path unit #文件或路径
  11. slice unit #进程组
  12. scope unit #不是由systemd启动的外部进程

 

通过文件名区分各个unit的不同类型,systemctl命令用法中对unit的操作,UnitName中也需要以这个Name.XXXX模式输入

注意:Unit与Unit File的区别

Unit的依赖性:不管什么Type的Unit,都会存在依赖性,包括该Unit在谁之前启动(want,before),该Unit在谁之后启动(requires,after)

当启动一个Unit的时候,会先去/usr/lib/systemd/system/和/etc/systemd/system/两个目录里查找UnitName目录和UnitName文件,比如graphical.target这个Unit

  1. graphical.target.wants目录指运行该Unit之前需要运行什么
  2. graphical.target.requires目录指运行该Unit之后需要运行什么
  3. 然后通过graphical.target文件,确定运行该Unit之前需要先运行什么后运行什么
  4. graphical.target文件中的want,before,requires,after字段说明详见本文下面的Unit配置文件说明

Target Unit说明

​启动计算机的时候,需要启动大量的 Unit。如果每一次启动,都要一一写明本次启动需要哪些 Unit,显然非常不方便。Systemd 的解决方案就是 Target。

 

简单说,Target 就是一个 Unit 组,包含许多相关的 Unit 。启动某个 Target 的时候,Systemd 就会启动里面所有的 Unit。从这个意义上说,Target 这个概念类似于"状态点",启动某个 Target 就好比启动到某种状态。

注意

  1. 在启动系统的时候,也是首先通过查询target中的内容进行启动相应的Unit,详细启动过程见1.1.系统启动流程.note
  2. 传统的init启动模式里面,有 RunLevel 的概念,跟 Target 的作用很类似。不同的是,RunLevel 是互斥的,不可能多个 RunLevel 同时启动,但是多个 Target 可以同时启动。比如我启动graphical.target则里面就包含运行图形界面的Unit和multi-user.target中的所有Unit。

systemd中unit配置目录、文件说明

配置目录说明:

  1. /usr/lib/systemd/system/ #官方安装的软件,默认启动脚本配置文件全在这里
  2. /run/systemd/system/ #系统执行过程中所产生的服务脚本,执行优先级比上一个高
  3. /etc/systemd/system/ #管理员依据主机系统的需求所创建的执行脚本,执行优先级又比上一个高。当使用systemctl enable|disable UNIT命令的时候,会自动在该目录中创建软连接到/usr/lib/systemd/system/目录中的Unit文件
  4. 目录例子:
    1. /usr/lib/systemd/system/vsftpd.service :官方释出的默认配置文件;
    2. /etc/systemd/system/vsftpd.service.d/CUSTOM.conf :在/etc/systemd/system下面创建与配置文件相同文件名的目录,但是要加上.d的扩展名。然后在该目录下创建配置文件即可。另外,配置文件最好附文件名取名为.conf较佳!在这个目录下的文件会“累加其他设置”进入/usr/lib/systemd/system/vsftpd.service内喔!
    3. /etc/systemd/system/vsftpd.service.wants/ :此目录内的文件为链接文件,设置相依服务的链接。意思是启动了vsftpd.service之后,最好再加上这目录下面建议的服务。
    4. /etc/systemd/system/vsftpd.service.requires/ :此目录内的文件为链接文件,设置相依服务的链接。意思是在启动vsftpd.service之前,需要事先启动哪些服务的意思。

(可以通过建立新的这种文件,达到运行多个同样进程的目的,还可以建立多个VSFTPD,监听不同端口)

一般情况文件放在/lib/systemd/system/文件夹下,文件名为UnitName.UnitType,例vsftpd.service

 

配置文件分为4种状态,当启用(enable)该文件的时候,从配置文件目录建立一个软连接到/etc/systemd/system/目录下,当禁用(disable)该文件的时候,会把该软连接删除。如果在/etc/systemd/system/目录下有Unit的配置文件,则开机则会自动加载并启动Unit。可以使用命令systemctl list-unit-files命令查看所有的配置文件状态。结论:建立了连接则说明该Unit会开机启动,没建立连接则该Unit不会开机启动;还可以禁止该Unit建立连接,则说明该Unit永远不能开机启动。

 

  1. enabled:启用(该文件已建立链接)
  2. disabled:禁用(该文件没建立链接)
  3. static:这个文件不可以被建立链接,但是可以被其他服务进行关联启动
  4. masked:该配置文件被禁止建立启动链接,可以使用systemctl unmask命令开启

配置文件分三个部分

第一部分:[Unit] #unit本身的说明,以及与其他相依赖的daemon的设置,包括在什么服务之前或之后启动等设置

  1. Description #该Unit描述,用systemctl list-units和systemctl status查看服务时候的描述内容就是这里定义的
  2. Documentation #提供该Unit可以进一步文件查询的地址或者位置
  3. After(Before) #在哪些之后(前)启动,说明该Unit可以在哪些daemon启动后(前)才能够启动,非强制性,只是推荐规范
  4. Requires #需要启动哪些,说明启动该Unit需要启动哪些Unit才能启动,强制性的,如果不启动该项定义的daemon则无法启动该Unit
  5. Wants #想要启动哪些,与Requires相反,说明启动该Unit后想要启动哪些daemon,非强制
  6. Conflicts #代表该Unit与列表中的daemon有冲突,如果该设置里的服务启动了,那么这个Unit就不能启动

第二部分:[Service],[Socket],[Timer].[Mount],[Path]...等 #不同的unit type就使用相对应的设置项目,这里面设定服务启动的脚本,环境配置文件文件名,重启方式等等

  1. [Service]区块用来 Service 的配置,只有 Service 类型的 Unit 才有这个区块。它的主要字段如下。
  2. Type:定义启动时的进程行为。它有以下几种值。
  3. Type=simple:默认值,执行ExecStart指定的命令,启动主进程
  4. Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出
  5. Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行
  6. Type=dbus:当前服务通过D-Bus启动
  7. Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行
  8. Type=idle:若有其他任务执行完毕,当前服务才会运行
  9. ExecStart:启动当前服务的命令
  10. ExecStartPre:启动当前服务之前执行的命令
  11. ExecStartPost:启动当前服务之后执行的命令
  12. ExecReload:重启当前服务时执行的命令
  13. ExecStop:停止当前服务时执行的命令
  14. ExecStopPost:停止当其服务之后执行的命令
  15. RestartSec:自动重启当前服务间隔的秒数
  16. Restart:定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog
  17. TimeoutSec:定义 Systemd 停止当前服务之前等待的秒数
  18. Environment:指定环境变量

第三部分:[Install]指定unit安装在哪个target(unit集合)里面去

  1. [Install]通常是配置文件的最后一个区块,用来定义如何启动,以及是否开机启动。它的主要字段如下。
  2. WantedBy:它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中
  3. RequiredBy:它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中
  4. Alias:当前 Unit 可用于启动的别名
  5. Also:当前 Unit 激活(enable)时,会被同时激活的其他 Unit

总结以及注意事项

在使用systemctl命令时,会有两个子命令,systemctl list-units和systemctl list-unit-files,这俩命令的区别如下

  1. list-units是列出已经载入的Unit(加上-a选项可以看start和stop所有的),其中还包括各种.device的unit,这类设备是硬件,没有配置文件的,不会再list-unit-files命令下列出来
  2. list-unit-files是列出所有已经安装的Unit的配置文件(有一部分Unit是没有配置文件的),安装完的Unit会把配置文件存放在/lib/systemd/system/目录下,而且通过查看list-unit-files还能看出来是否是开机启动,具体原因请见下文的《systemd的unit配置文件说明》

chkconfig,service查询服务

service --status-all #将会运行所有的启动脚本来显示各个服务的运行状态

查看服务自启动 chkconfig

chkconfig --list 查看所有服务的自启动情况

chkconfig Susefirewall2_setup off 设置为开机不自启动

chkconfig Susefirewall2_init off 设置为开机不自启动

chkconfig --level 35 vsftpd on

posted @ 2018-11-18 22:51  断念梦  阅读(4705)  评论(0编辑  收藏  举报