systemd和systemctl
systemd是Linux系统最新的初始化系统(init),作用是提高系统的启动速度,尽可能启动较少的进程,尽可能更多进程并发启动,systemd对应的进程管理命令就是systemctl。
Linux 服务管理有两种方式service和systemctl。systemctl命令兼容了service
systemctl命令的好处
这里咱们梳理一下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更加有弹性。
服务状态
这里我们可以先试用下面这个指令查看一下firewalld服务的当前状态,指令和结果如下:
systemctl status firewalld.service
看到高亮的那个没有,这就是当前服务的状态。那么服务有哪几种常见的状态呢,这里列举说明一下。
- active(running):正有一只或多只程序正在系统中执行的意思;
- active(exited):仅执行一次就正常结束的服务,目前并没有任何程序在系统中执行;
- active(waiting):正在执行当中,不过还需要等待其他的事件才能继续处理;
- inactive:这个服务目前没有运行;
- dead:程序已经清除;
上面是运行结果中,我圈出了一个地方,那个是啥?那个其实是这只服务程序的启动状态,也分为一下几种状态。
- enabled:这个daemon将在开机时被执行;
- disabled:这个daemon在开机时不会被执行;
- static:这个daemon不可以自己启动(enable不可),不过可能会被其他的enabled 的服务来唤醒(关联属性的服务);
- mask:这个daemon无论如何都无法被启动,因为已经被强制注销(非删除),可通过systemctlunmask方式改回原本状态;
常用指令
#语法
systemctl COMMAND name.service
#启动
systemctl start name.service
#停止
systemctl stop name.service
#重启
systemctl restart name.service
#查看状态
systemctl status name.service
#禁止自动和手动启动
systemctl mask name.service
#取消禁止
systemctl unmask name.service
#查看某服务当前激活与否的状态:
systemctl is-active name.service
#查看所有已经激活的服务:
systemctl list-units --type|-t service
#查看所有服务:
systemctl list-units --type service --all|-a
#设定某服务开机自启,相当于chkconfig name on
systemctl enable name.service
#设定某服务开机禁止启动:相当于chkconfig name off
systemctl disable name.service
#查看所有服务的开机自启状态,相当于chkconfig --list
systemctl list-unit-files --type service
#用来列出该服务在哪些运行级别下启用和禁用:chkconfig –list name
ls /etc/systemd/system/*.wants/name.service
#查看服务是否开机自启:
systemctl is-enabled name.service
#列出失败的服务
systemctl --failed --type=service
#开机并立即启动或停止
systemctl enable --now postfix
systemctl disable --now postfix
#查看服务的依赖关系:
systemctl list-dependencies name.service
#杀掉进程:
systemctl kill unitname
#重新加载配置文件
systemctl daemon-reload
#关机
systemctl halt、systemctl poweroff
#重启:
systemctl reboot
#挂起:
systemctl suspend
#休眠:
systemctl hibernate
#休眠并挂起:
systemctl hybrid-sleep