systemd服务脚本详解与管理命令
一、systemd简介
1.1、systemd的简介
systemd是Linux系统的基础组件集合,它提供了系统的服务管理(可简单理解为Windows的任务管理),运行后是PID=1的进程(是其他所有进程的父进程);历史上systemd中的服务(service)还被称作守护进程(daemon),它们在后台运行为特定的事件提供服务。监视和控制systemd的主要命令是【systemctl】。
序号 | systemd的功能 |
1 | 支持并行化的任务 |
2 | 同时采用socket式与D-Bus总线式启用服务 |
3 | 按需启动守护进程(daemon) |
4 | 利用Linux的CGroups监视进程 |
5 | 支持快照和系统恢复 |
6 | 维护挂载点和自动挂载点 |
7 | 各服务间基于依赖关系进行精密控制 |
8 | 支持SysV和LSB初始脚本(可替代sysvinit) |
9 | 还可控制基础系统配置(如:简单的网络配置、时间同步、日志转发和域名解析等),维护登录用户列表及其系统账户、运行时的目录和设置 |
10 | 还可以运行容器和虚拟机 |
在不同版本的Linux(红帽系)系统中,对于管理服务的方式是有区别的:
《1》在Centos6及其之前的版本中,如果要写服务脚本,那这些服务脚本是必须放置在【/etc/init.d】目录下的,且这些脚本都是bash脚本,编写复杂。
《2》在RHEL7/Centos7及其之后的Linux版本中,采用了新的方式【unit】管理服务,这种方式编写服务脚本按照标准格式编写即可,且可以通过systemd命令集对这些编写好的脚本进行管理,较为简单便捷。
1.2、systemd的说明与使用
序号 | systemd内容 | 说明 |
1 | systemd | systemd是Linux上的系统守护进程管理工具,最后的字母d表示(daemon)是守护进程的缩写;故systemd表示守护系统含义; systemd可以管理Linux系统中的所有资源,不同的资源统称为Unit。常见的Unit有: 《1》Service Unit:文件扩展名为【.service】用于定义系统服务; 《2》Target Unit:文件扩展名为【.target】用于模拟实现“运行级别”; 《3》Mount Unit:文件扩展名为【.mount】用于定义文件系统挂载点; systemd是内核启动后的第一个用户进程,PID是1,是其他所有进程的父进程。 |
2 | 服务存放路径 | 服务文件的存放路径: 《1》【/etc/systemd/system/】系统管理员手动软件安装包或脚本放置在此,优先级更高; 《2》【/run/systemd/system/】运行时配置文件,该目录一般是进程在运行时动态创建unit文件的目录,一般很少修改,除非是修改程序运行时的一些参数时【即:session级别的,才在这里修改】; 《3》【/usr/lib/systemd/system/】该目录包含的是软件包安装的单元,也就是说通过yum\dnf\rpm等软件包管理命令管理的systemd单元文件,都放置在该目录下; 《4》【/lib/systemd/sytem/】该目录下的单元一部分指向【/usr/lib/systemd/system】 注意:systemd默认从【/etc/systemd/system/】目录下读取配置文件,但是该目录下存放的大部分文件都是符号链接(指向的是【/usr/lib/systemd/system/】目录;也就是说真正的文件是存放在该个目录下) |
3 | systemctl语法 | systemctl command unit(配置的应用名称) command常用选项: 《1》【start】启动指定的应用服务【systemctl start nginx】 《2》【stop】关闭指定的应用服务【systemctl stop nginx】 《3》【restart】重启指定的应用服务【systemctl restart nginx】 《4》【reload】重载指定的应用服务【systemctl reload nginx】 《5》【enable】系统开机时自动启动指定应用服务【systemctl enable nginx】 《6》【disable】开机时不自动运行指定应用服务【systemctl disable nginx】 《7》【status】查看指定应用服务的运行状态【systemctl status nginx】 《8》【is-enabled】查看指定的服务是否配置为自动启动【systemctl is-enabled nginx】 《9》【mask】屏蔽指定服务,使其无法启动【systemctl mask nginx】 《10》【unmask】取消屏蔽指定服务【systemctl unmask nginx】 |
二、systemd Unit资源文件解析
2.1、典型的服务单元文件示例
[Unit]
Description=Postfix Mail Transport Agent
After=syslog.target network.target[Service]
Type=forking
PIDFile=/var/spool/postfix/pid/master.pid
EnvironmentFile=-/etc/sysconfig/network
ExecStartPre=-/usr/libexec/postfix/aliasesdb
ExecStartPre=-/usr/libexec/postfix/chroot-update
ExecStart=/usr/sbin/postfix start
ExecReload=/usr/sbin/postfix reload
ExecStop=/usr/sbin/postfix stop[Install]
WantedBy=multi-user.target
一般我们自己创建的服务内容有三个部分,如上示例所示的
序号 | 服务单元所需的三个结构段 | 说明 |
1 | [Unit] | 服务单元的通用信息(知道这个服务是什么,有什么要求、能做什么) |
2 | [Service] | 服务单元的具体配置内容(启动什么内容、什么时候启动、如何启动) |
3 | [Install] | 服务单元的安装信息(给那些服务做依赖或依赖哪些服务) |
序号 | 结构段 | Unit文件类型 | 说明 |
1 | [Unit] | 所有类型 | 用于描述Unit及其配置依赖内容 |
2 | [Service] | .service | 服务本体的内容配置(包含服务生命周期和上下文配置) |
3 | [Install] | 所有类型 | 设置Unit用于那种目标中 |
4 | [Socket] | .socket | 套接字设置 |
5 | [Timer] | .timer | 用于配置定时触发任务(可替代Crontab) |
6 | [Path] | .path | 用于监控指定目录或文件的变化,并触发其他Unit运行 |
7 | [Mount] | .mount | 用于定义系统结构层次中的一个挂载点(可用于替代过去的/etc/fstab) |
8 | [Swap] | .swap | 用于定义一个用户做虚拟内存的交换分区 |
9 | [Slice] | .slice | 用于表示一个CGroup的树(通常用户不会自己创建这样的Unit文件) |
10 | [Scope] | .scope | 用于描述一些系统服务的分组信息(这种文件是systemd运行时产生的) |
2.2、用户可配置的Unit资源文件结构段内容详解
2.2.1、Unit结构段解析
序号 | 配置选项 | 说明 |
1 | Description= | 对本Unit(服务)的描述,方便了解是什么(会在查看该Unit状态时显示) |
2 | Documentation= | 本服务的帮助文档链接,方便用户更好的学习使用该服务内容 |
3 | Requires= | 本服务依赖的其他Unit列表,这些请求的Unit模块会在本服务启动时同时被启动 注意:若这些Unit中任意一个启动失败,本服务也会被终止,无法启动 |
4 | Wants= | 与Requires相似;这些请求的Unit模块会在本服务启动时同时被启动 注意:这些Unit中的模块有启动失败的,都不会影响本服务的启动 |
5 | Before= After= | 定义启动顺序: Before=xxx.service(代表本服务必须在xxx.service启动之前启动运行后才启动); After=xxx.service,代表本服务在xxx.service完全启动成功后才会启动本服务。 |
6 | Binds To= | 与Requires相似,这些请求的Unit模块会在本服务启动时同时被启动 注意:本服务与这些绑定的Unit要么一起启动成功,要么一起启动失败;且绑定的任意Unit出现意外结束或重启时,本服务也会跟着终止或重启。 |
7 | Part Of= | 是Binds To作用的子集,仅在这个设置的Unit所属模块失败或重启时,终止或重启当前的服务,不会随本服务的启动而启动 |
8 | OnFailure= | 当本服务启动失败时,就会自动启动这里配置的这些Unit |
9 | Conflicts= | 配置与当前Unit冲突的其他模块,它们不能同时共存(即:如果列出的模块中有已经在运行的,这个服务就不能启动,反之亦然) |
10 | Condition...= | Unit启动前的条件判断(如ConditionPathExists= 、ConditionUser= )等内容判断 |
11 | Assert...= | 资源判断,但是这个内容失败时会导致硬错误,Unit无法启动 |
2.2.2、Service结构段解析
序号 | 配置选项 | 说明 |
1 | Type= | 设置服务启动时的进程行为,有如下五种类型可选: 《1》simple(默认类型,简单服务)【执行ExecStart指定的程序命令,作为主进程(即启动的命令程序内容就是主体程序,这个程序要是退出,那么一切都退出】; 《2》forking(标准启动方式)【服务包含父进程和子进程,启动程序后,会调用 fork() 函数,通过父进程生成子进程】; 《3》oneshot(一次性启动)【启动完成执行一次后,进程就没了;通常用于初始化】; 《4》notify(与simple 类似)【但是notify会在当前服务启动完毕后,会发送一个readiness信号通知systemd继续往下执行】; 《5》idle(延迟到所有任务处理完成后在启动本服务); 《6》dbus(当前的服务通过D-BUS启动) |
2 | ExecStart= | 服务启动时执行的命令【此命令就是服务的主体】必须指定 |
3 | ExecStartPre= | 在本服务(ExecStart)执行前所用调用的命令 |
4 | ExecStartPost= | 在本服务(ExecStart)执行后所用调用的命令 |
5 | ExecStop= | 停止本服务(ExecStart)时执行的命令 |
6 | ExecStopPost= | 定制本服务(ExecStart)后执行的命令 |
7 | ExecReload= | 定义重新载入服务的命令 |
8 | Restart= | 配置服务的重启策略(即:何种情况下会重启服务): 《1》no(默认配置,表示不重启); 《2》on-success(表示成功退出时重启); 《3》on-failure(表示非0退出时重启); 《4》always(无论如何都重启); 《5》on-abnormal(信号或core dump时重启) |
9 | RestartSec= | 设置服务重启前的延迟秒数 |
10 | RemainAfterExit= | 适用于 值可设置为true或false,默认是false;当配置为true时,systemd只会负责启动服务进程,之后即使本服务进程退出了,systemd也仍然会认为这个服务还在运行中(该配置主要适用于一些非常驻内存,启动后立即退出,然后等待消息按需启动的服务如:oneshot类型) |
11 | TimeoutStartSec= TimeoutStopSec= | 启动服务时的允许等待的秒数(若超过时间仍然没有停止,systemd则会使用SIGKILL信号强行杀死服务); 停止服务时允许的等待秒数(若超过时间仍然没有停止,systemd则会使用SIGKILL信号强行杀死服务); |
12 | User= Group= | 服务运行所使用的用户; 服务运行所使用的用户组; |
13 | WorkingDirectory= | 指定服务的工作目录 |
14 | RootDirectory | 指定服务进程的根目录(如果配置了这个参数,服务将无法访问指定目录以外的任何文件) |
15 | Environment= EnvironmentFile= | 为本服务设置环境变量; 指定加载一个包含本服务所需的环境变量列表文件,文件中的每一行都是一个环境变量定义; |
16 | StandardOutput= StandardError= | 设置日志的输出(journal,syslog,null,tty等) |
17 | LimitCPU= LimitNOFILE= LimitNPROC= | 限制CPU核数; 限制文件句柄数量; 限制子进程数量; |
18 | Nice | 服务进程的优先级,指越小则优先级别越高(默认是0,-20为最高优先级,19为最低优先级) |
注意:启动(ExecStart)、重启(Restart)、停止(ExecStop)命令全部要求使用绝对路径(ExecStartPre 和 ExecStartPost 辅助命令,若前面有个 “-” 符号,表示忽略这些命令的出错) |
2.2.3、Install结构段解析
序号 | 配置选项 | 说明 |
1 | WantedBy= | 表示依赖当前服务的模块;值可以是一个或多个Target(值一般为【multi-user.target】); 当前Unit激活时(enable)符号链接会放入【/etc/systemd/system/】目录下的【xxx.target.wants】目录里面(如:/etc/systemd/system/multi-user.target.wants) |
2 | RequiredBy= | 表示当前服务会被添加到其他 unit 的 Requires= 依赖中 |
3 | Also | 本服务(Unit)激活(enable)或禁用(disable)时,会同时激活或禁用这里设置的Unit |
4 | Alias | 本服务(Unit)可用于启动的别名,提供给systemctl调用 |
2.2.4、Timer结构段解析
序号 | 配置选项 | 说明 |
1 | OnCalendar= | 设置定时的启动服务的时间(类似cron表达式,具体设置可参考systemd.time(7))如:daily |
2 | OnBootSec= | 开机后多久启动(如:10min) |
3 | OnUnitActiveSec= | 上次激活后多久再次启动(如:1h) |
OnUnitInactiveSec= | 上次激活停用后多久再次启动(如:1h) | |
4 | RandomizedDelaySec= | 设置随机选择的均匀方式延迟计时器(范围是0和指定时间)【默认是0,表示不应用随机延迟】 |
5 | AccuracySec= | 指定计时器的精度(默认是1分钟) |
6 | Persistent= | 是否补偿丢失事件【默认值是false】(若设置为true则上次触发的存储在磁盘本地的service Unit在计时器激活时会立即触发该服务;若计时器处于非活动状态期间则至少触发一次) |
2.2.5、Path结构段解析
序号 | 配置选项 | 说明 |
1 | PathExists= | 用于监视文件或目录是否存在(如果指定的文件存在,则激活已配置的单元); |
2 | PathExistsGlob= | 也是用于监视文件或目录是否存在(但会检查@通配符是否存在,且至少有一个文件与指定的通配模式匹配) |
3 | PathChanged= | 可用于监视文件或目录并激活已配置的单元(即:每当它发生变化时,它不会在每次写入监视文件时激活 ;但是,如果打开写入的文件被关闭后,则会激活它) |
4 | PathModified= | 与PathChanged类似,且这里在文件被写入时就会被激活 |
5 | DirectoryNotEmpty= | 可用于监视目录且目录至少包含一个文件 |
6 | Unit= | 被触发的Unit名称 |
7 | MakeDirectory= | 采用boolean值配置【默认是false】,如果设置true,在在监视之前创建路径; 注意:如果使用了PathExists设置则此项无效。 |
8 | DirectoryMode= | 如果启用了MakeDirectory=配置,则需要再这里指定有问题的目录,且给目录授权(采用数字表示法:如:0755) |
9 | TriggerLimitIntervalSec= | 配置次路径Unit的频率限制在特定的时间间隔内激活(单位有:us\ms\s\min\h...)【默认间隔为2s】 |
三、其他资料
systemd - Arch Linux 中文维基https://wiki.archlinuxcn.org/wiki/Systemd#