systemd 之 systemctl
Systemd 常规操作与彩蛋
一、前言
上了俩个月的RHCE工程师的班,收获颇多。话说回来,在 redhat 7 中有个非常重要的概念,即:systemd
systemd 是 Linux 下的一款系统和服务管理器,兼容 SysV 和 LSB 的启动脚本。systemd 的特性有:支持并行化任务;同时采用 socket 式与 D-Bus 总线式激活服务;按需启动守护进程(daemon);利用 Linux 的 cgroups 监视进程;支持快照和系统恢复;维护挂载点和自动挂载点;各服务间基于依赖关系进行精密控制。
二、基础知识
监视和控制 systemd 的主要命令是 systemctl。
该命令可用于查看系统状态和管理系统及服务。详见 man 1 systemctl。
使用单元
一个单元配置文件可以描述如下内容之一:系统服务(.service)、挂载点(.mount)、sockets(.sockets) 、系统设备(.device)、交换分区(.swap)、文件路径(.path)、启动目标(.target)、由 systemd 管理的计时器(.timer)。详情参阅 man 5 systemd.unit 。
使用 systemctl 控制单元时,通常需要使用单元文件的全名,包括扩展名(例如 sshd.service )。但是有些单元可以在 systemctl 中使用简写方式。
- 如果无扩展名,systemctl 默认把扩展名当作 .service。例如netcfg和netcfg.service是等价的。
- 挂载点会自动转化为相应的 .mount单元。例如/home等价于home.mount。
- 设备会自动转化为相应的 .device单元,所以/dev/sda2等价于dev-sda2.device。
单元位置
所有可用的单元文件存放在 /usr/lib/systemd/system/ 和 /etc/systemd/system/ 目录(后者优先级更高)。注意,当 /usr/lib/ 中的单元文件因软件包升级变更时,/etc/ 中自定义的单元文件不会同步更新。要注意当单元文件被COPY至并完成修改后,一定要使用 systemctl daemon-reload 完成重载与应用。
编写单元
systemd 单元文件的语法来源于 XDG 桌面项配置文件.desktop文件,最初的源头则是Microsoft Windows的.ini文件。单元文件可以从两个地方加载,优先级从低到高分别是:
- /usr/lib/systemd/system/:软件包安装的单元
- /etc/systemd/system/:系统管理员安装的单元
- 当 - systemd运行在用户模式下时,使用的加载路径是完全不同的。
- systemd 单元名仅能包含 ASCII 字符,下划线和点号。其它字符需要用 C-style "\x2d" 替换。 
单元文件的语法,可以参考系统已经安装的单元,也可以参考 man systemd.service 中的EXAMPLES章节。
**提示: **以
#开头的注释可能也能用在 unit-files 中,但是只能在新行中使用。不要在 systemd 的参数后面使用行末注释, 否则 unit 将会启动失败。
处理依赖关系
使用 systemd 时,可通过正确编写单元配置文件来解决其依赖关系。典型的情况是,单元 A 要求单元 B 在 A 启动之前运行。在此情况下,向单元 A 配置文件中的 [Unit] 段添加 Requires=B 和 After=B 即可。若此依赖关系是可选的,可添加 Wants=B 和 After=B 。请注意 Wants= 和 Requires= 并不意味着 After= ,即如果 After= 选项没有制定,这两个单元将被并行启动。
依赖关系通常被用在服务(service)而不是目标(target)上。例如, network.target 一般会被某个配置网络接口的服务引入,所以,将自定义的单元排在该服务之后即可,因为 network.target 已经启动。
服务类型
编写自定义的 service 文件时,可以选择几种不同的服务启动方式。启动方式可通过配置文件 [Service] 段中的 Type= 参数进行设置。
- Type=simple:(默认值) systemd认为该服务将立即启动。服务进程不会 fork 。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket 激活型。
- Type=forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定- PIDFile=,以便 systemd 能够跟踪服务的主进程。
- Type=oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置- RemainAfterExit=yes使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。
- Type=notify:与- Type=simple相同,但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由- libsystemd-daemon.so提供。
- Type=dbus:若以此方式启动,当指定的- BusName出现在DBus系统总线上时,systemd认为服务就绪。
- Type=idle:- systemd会等待所有任务处理完成后,才开始执行- idle类型的单元。其他行为与- Type=simple类似。
type的更多解释可以参考 systemd.service(5)。
三、常规操作
快速了解
输出激活的单元
systemctl
审查系统运行状态
systemctl status
注意:这条命令也用于检查服务状态,可在其后加入服务名称或PID号即可查询。缺省下展示所有服务信息。
输出运行失败的单元
systemctl --failed
立即激活单元:
# systemctl start <单元>
常规使用
立即激活单元:
# systemctl start <单元>
立即停止单元:
# systemctl stop <单元>
重启单元:
# systemctl restart <单元>
重新加载配置:
# systemctl reload <单元>
输出单元运行状态:
$ systemctl status <单元>
注意:在输出显示中有Docs:标签,其内容即为:由单元文件提供的手册页;使用-l 参数可查看完整的服务状态日志(提取至内存,即最新)。
检查单元是否配置为自动启动(单):
$ systemctl is-enabled <单元>
检查单元是否配置为自动启动(全):
$ systemctl list-unit-files
注意:你并不需要立马背出该语句,在 chkconfig 命令中有写。依旧可以使用它完成服务的自启或取消自启,但使用 chkconfig 已经不能显示服务的状态了。
开机自动激活单元:
# systemctl enable <单元>
取消开机自动激活单元:
# systemctl disable <单元>
禁用一个单元(禁用后,间接启动也是不可能的):
# systemctl mask <单元>
取消禁用一个单元:
# systemctl unmask <单元>
重新载入 systemd,扫描新的或有变动的单元:
# systemctl daemon-reload
更多操作
修改默认运行级别/目标
开机启动的目标是 default.target,默认链接到 graphical.target (大致相当于原来的运行级别5)。可以通过内核参数更改默认运行级别:
- systemd.unit=multi-user.target(大致相当于级别3)
- systemd.unit=rescue.target(大致相当于级别1)
另一个方法是修改 default.target。可以通过 systemctl 修改它:
# systemctl set-default multi-user.target
要覆盖已经设置的default.target,请使用 force:
# systemctl set-default -f multi-user.target
可以在 systemctl 的输出中看到命令执行的效果:链接 /etc/systemd/system/default.target 被创建,指向新的默认运行级别。
切换运行级别/目标
systemd 中,运行级别通过“目标单元”访问。通过如下命令切换:
# systemctl isolate graphical.target
该命令对下次启动无影响。等价于telinit 3 或 telinit 5。
| SysV 运行级别 | Systemd 目标 | 注释 | 
|---|---|---|
| 0 | runlevel0.target, poweroff.target | 中断系统(halt) | 
| 1, s, single | runlevel1.target, rescue.target | 单用户模式 | 
| 2, 4 | runlevel2.target, runlevel4.target, multi-user.target | 用户自定义运行级别,通常识别为级别3。 | 
| 3 | runlevel3.target, multi-user.target | 多用户,无图形界面。用户可以通过终端或网络登录。 | 
| 5 | runlevel5.target, graphical.target | 多用户,图形界面。继承级别3的服务,并启动图形界面服务。 | 
| 6 | runlevel6.target, reboot.target | 重启 | 
| emergency | emergency.target | 急救模式(Emergency shell) | 
四、一些彩蛋
显示系统自动时间
# systemd-analyze blame
输出系统启动图片
systemd-analyze plot > bootchart.svg
systemd-analyze dot | dot -Tsvg > bootchart.svg

注意:这俩个彩蛋依赖于画图工具,需进行安装。yum -y install plot graphviz
systemd 之 systemctl的更多相关文章
- centos7当中的systemd及systemctl(节选)
		全面进入centos7时代,这个东东是需要系统了解的. http://blog.jobbole.com/85070/?utm_source=blog.jobbole.com&utm_mediu ... 
- CentOS 7上的系统管理之:Systemd和systemctl
		参考资料: Chapter 10. Managing Services with systemd Red Hat Enterprise Linux 7 | Red Hat Customer Porta ... 
- Linux  Systemd 详细介绍: Unit、Unit File、Systemctl、Target
		Systemd 简介 CentOS 7 使用 Systemd 替换了SysV Ubuntu 从 15.04 开始使用 Systemd Systemd 是 Linux 系统工具,用来启动守护进程,已成为 ... 
- 【搬运】systemctl 命令完全指南
		Systemctl是一个systemd工具,主要负责控制systemd系统和服务管理器. Systemd是一个系统管理守护进程.工具和库的集合,用于取代System V初始进程.Systemd的功能是 ... 
- systemd
		本文参照:https://wiki.archlinux.org/index.php/Systemd#Basic_systemctl_usage 做了翻译和整理 systemd是Linux下的一种ini ... 
- systemd service
		Man page systemd.unit SYSTEMD.UNIT(5) systemd.unit SYSTEMD.UNIT(5) NAME systemd.unit - Unit configur ... 
- systemctl 命令完全指南
		http://www.linuxidc.com/Linux/2015-07/120833.htm Systemctl是一个systemd工具,主要负责控制systemd系统和服务管理器. System ... 
- systemd.service 中文手册
		版权声明 本文译者是一位开源理念的坚定支持者,所以本文虽然不是软件,但是遵照开源的精神发布. 无担保:本文译者不保证译文内容准确无误,亦不承担任何由于使用此文档所导致的损失. 自由使用:任何人都可以自 ... 
- Linux systemctl 命令完全指南
		Systemctl是一个systemd工具,主要负责控制systemd系统和服务管理器. Systemd是一个系统管理守护进程.工具和库的集合,用于取代System V初始进程.Systemd的功能是 ... 
随机推荐
- C/C++ -- Gui编程 -- Qt库的使用 -- QtWidget
			#include<QtGui> int main(int argc, char * argv[]) { QApplication app(argc, argv); QTextCodec:: ... 
- 前端通信:ajax设计方案(一)---集成核心请求
			报告,我要说话!xp被历史淘汰了,IE6 say goodbye了,太TM开心了,从此不要兼容IE6了,哈哈哈哈哈哈 报告,我要说话!IE这sb为啥不早点被杀掉呢,找工作听说要兼容IE,立马软了,唉唉 ... 
- 机器学习--Gradient Boosting Machine(GBM)调参方法详解
			一.GBM参数 总的来说GBM的参数可以被归为三类: 树参数:调节模型中每个决策树的性质 Boosting参数:调节模型中boosting的操作 其他模型参数:调节模型总体的各项运作 1.树参数 现在 ... 
- 面试题43:计算多少种译码方式(decode-ways)
			这道题是非常典型的DP问题.按照DP的套路,关键是讨论出递推表达式,遍历过程中针对当前字符是否为'0'以及前一个字符为'0',分类讨论得出到目前字符为止最多有多少种译码方式?理清了递推表达式,代码是很 ... 
- 使用Koa2搭建web项目
			随着Node.js的日益火热,各种框架开始层出不穷的涌现出来,Node.js也开始逐渐的被应用到处理服务端请求的场景中.搭建Web项目的框架也随之开始出现——express.koa.koa2.egg等 ... 
- 如何在.Net Core MVC中为动态表单开启客户端验证
			非Core中的请参照: MVC的验证 jquery.validate.unobtrusive mvc验证jquery.unobtrusive-ajax 参照向动态表单增加验证 页面引入相关JS: &l ... 
- Firebird reset SYSDBA password
			Firebird 重置超级管理员SYSDBA密码 首先登陆到服务器上(以下以Windows系统演示),命令行进入安装目录,我这里是 D:\-Installer\-Firebird\Firebird-3 ... 
- jquery插件导出word:jquery.wordexport.js
			前言 今天项目中遇到一个需求把我们系统中的统计数据导出来(主要是表格).其实实现的的方法有很多,而此次针对我的系统第一获取数据有点慢,加上前不久写了一个在线阅读pdf,故此这次也想用前端的方式来导出. ... 
- java自学-运算符
			上一篇介绍了java的变量和数据类型,要对数据处理,还需要用到java运算符,这里只总结下常用的,运算符主要分为以下几类:1 算数运算符 算数运算符包括: + 加法运算 - 减法运算 * 乘法运算 / ... 
- 遍历FTP目录及下载
			操作ftp,直接在main方法中即可操作. 例1:遍历ftp目录中的文件 public static void main(String[] args) throws IOException { FTP ... 
