systemctl系统服务管理

在Cento6以及以前的系统中,启动的第一个进程为init,init进程负责后面所有进程的启动,但是通过init进程启动的后续进程都是串行启动的,启动速度会慢一些(服务依靠shell脚本顺序启动)

Centos7之后的系统默认采用systemctl 管理系统服务,第一个进程名为为systemd,systemd采用并行启动后续的进程,因此启动速度会更快一些(服务依靠缓冲池,先缓存等待使用)

systemctl的管理单位是unit,不仅仅管理service,service只是unit的一种

更新systemd,命令如下:

yum upgrade systemd -y

service服务文件存放路径以及格式(以nginx为例子):

/usr/lib/systemd/system/nginx.service #有的书写的是/lib/systemd/system,其实lib就是软链接到/usr/lib

service服务文件一般包含三个部分,第一部分为[unit],第二部分为[service],第三部分为[install]

  • Unit:定义与unit类型无关的通用选项,主要为描述信息、unit行为以及依赖关系
  • Service:定义相关的各项参数
  • Install:定义由systemctl enable以及systemctl disable命令实现启用与禁用的一些选项

1、Unit常用的选项:

可选项描述
Description对当前服务的简单描述
After可以指定在哪些服务之后进行启动
Before可以指定在哪些服务之前进行启动
Requires指定依赖于哪些服务(此依赖是”强依赖”,一旦所依赖的服务异常,当前的服务也随之停止)
Wants指定依赖于哪些服务(此依赖是”弱依赖”,所依赖的服务异常,不影响当前的服务)
Conflicts定义units间的冲突关系

下面以nginx服务文件为例子进行演示unit模块配置,如图:

从上图可以看出,nginx在网络服务启动后才启动,对网络为弱依赖

2、Service常用选项:

可选项描述
Environment为服务添加环境变量
EnvironmentFile文件中定义了当前服务启动的环境变量
ExecStart指定服务启动时执行的命令或脚本
ExecStartPre指定服务启动前执行的命令或脚本
ExecStartPost指定服务启动后执行的命令或脚本
ExecStop指明停止服务要运行的命令或脚本
ExecStopPost指定服务停止后执行的命令或脚本
RestartSec指定服务在重启时等待的时间,单位为秒
ExecReload指明重启服务要运行的命令或脚本
Restart当Restart=1 时,daemon服务意外终止后,会再次自动启动此服务,看下方(2)
PrivateTmp设定为yes时,会在生成/tmp/systemd-private-UUID-NAME.service-XXXXX/tmp/目录
KillMode指定停止的方式,具体见下面(3)
Restart指定重启时的类型,具体见下面
Type指定启动类型,具体见下面(1)
WorkingDirectory指定服务的工作目录
Nice服务的进程优先级,值越小优先级越高,默认为0。-20为最高优先级,19为最低优先级
RootDirectory服务进程的根目录,配置了这个参数后,服务将无法访问指定目录以外的任何文件
User运行服务的用户,会影响服务对本地文件系统的访问权限
Group运行服务的用户组,会影响服务对本地文件系统的访问权限
PIDFile守护进程的PID文件,必须是绝对路径。强烈建议在 Type=forking 的时候设置此选项
BusName设置与此服务通信所使用的 D-Bus 名称,在 Type=dbus 的情况下必须设置此选项
TimeoutStartSec设定该服务允许的最大启动时长,设为0,表示永不超时
TimeoutStopSec该服务允许的最大停止时长,设为0,表示永不超时
WatchdogSec设置该服务的看门狗(watchdog)的超时时长,看门狗将在服务成功启动之后被激活
LimitNOFILE此服务可打开的文件描述符最大数,可设置为infinity,等同于65536
LimitNPROC单个用户可用的最大进程数量,可设置为infinity,等同于65536
 LimitCORE限制核心转储文件的最大大小(KB)
StartLimitIntervalSec在StartLimitIntervalSec时间内,最多允许启动StartLimitBurst次
StartLimitBurst与StartLimitIntervalSec配合使用

(1)、Type可选值:

可选项描述
simple指定ExecStart字段的进程为主进程
forking指定以fork() 子进程执行ExecStart字段的进程,建议与PIDFile一起使用
oneshot执行一次
notify启动后会发送通知信号给systemd
idle等其他任务结束后才运行
dbus设置了 ExecStart= 与 BusName= 时的默认值,与simple类似

(2)、Restart的可选值

可选项描述
no退出后不会重启
on-success当进程正常退出时(退出码为0) 执行重启
on-failure当进程不正常退出时(退出码不为0) 执行重启
on-abnormal当被信号终止和超时执行重启
on-abort当收到没有捕捉到的信号终止时执行重启
on-watchdog当看门狗超时时执行重启
always一直重启

(3)、KillMode可选值

可选项描述
control-group杀掉当前进程中所有的进程
process杀掉当前进程的主进程
mixed主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
none不杀掉任何进程

3、Install常用选项:

Install段是服务的安装信息,它不在 systemd 的运行期间使用,只在使用 systemctl enable 和 systemctl disable 命令启用/禁用服务时有用,所有 Unit 文件通用,用来定义如何启动,以及是否开机启动,参数详解如下:

  • WantedBy:它的值是一个或多个 target,执行enable命令时,符号链接会放入/etc/systemd/system目录下以target 名 + .wants后缀构成的子目录中。“WantedBy=multi-user.target” 表明当系统以多用户方式(默认的运行级别)启动时,这个服务需要被自动运行。当然还需要 systemctl enable 激活这个服务以后自动运行才会生效
  • RequiredBy:依赖当前服务的模块。它的值是一个或多个 target,执行enable命令时,符号链接会放入/etc/systemd/system目录下以 target 名 + .required后缀构成的子目录中
  • Also:当前 Unit 被 enable/disable 时,会被同时操作的其他 Unit
  • Alias:当前 Unit 可用于启动的别名

4、下面是常见的服务配置的例子

(1)、docker服务文件:

(2)、nginx服务文件:

(3)、redis服务配置文件

标签