1、概念

守护进程:在后持续运行的进程,常驻内存的进程。一般进程执行完就结束了,但守护进程被执行后,一直在后台持续运行,直到关机,或发出一个结束指令

服务:实现某一项功能的集合,我们称为一个service

 

2、systemd

systemd 是Linux下的一款系统和服务管理器,兼容SysV(rhel5)和upstart(rhel6) 的启动脚本。

 

2.1、init

rhel6,用init来管理系统

  • 管理工具太多,一个工具作一作事,比如:服务是否开机启动,使用chkconfig命令;启动一个服务,用service命令,通过执行/etc/init.d目录下的服务启动脚本来实现

  • init,通过脚本启动服务,而脚本需要借助bash解释执行

  • init,所有服务串行启动,启动一个服务,它所依赖的服务没启动,就启动不了,需要按顺序启动服务

 

2.2、systemd

  • systemd,提供了一个统一管理工具:systemctl

  • systemd,自身就是一个强大的解释器,不需要借助其它程序,根据配置文件,启动服务

  • systemd,系统引导时实现服务并行启动,并且按需激活进程

 

2.3、对比

System V init

运行级别

systemd目标名称

作用

0

runlevel0.target -> poweroff.target

关机

1

runlevel1.target -> rescue.target

单用户模式

2

runlevel2.target -> multi-user.target

等同于级别3

3

runlevel3.target -> multi-user.target

多用户的文本界面

4

runlevel4.target -> multi-user.target

等同于级别3

5

runlevel5.target -> graphical.target

多用户的图形界面

6

runlevel6.target -> reboot.target

重启

emergency

emergency.target

紧急shell

 

3、systemd配置文件

    每个Unit都有一个配置文件,告诉Systemd怎么启动这个Unit。

    Systemd默认从目录/etc/systemd/system/读取配置文件,但是里面存放的大部分文件都是软链接,指向目录/usr/lib/systemd/system/或者/lib/systemd/system/,Unit的配置文件都存放在这个目录里面。

 

注意:

  • 当 /usr/lib/ 中的单元文件因软件包升级变更时,/etc/ 中自定义的单元文件不会同步更新。要注意当单元文件被COPY至并完成修改后,一定要使用 systemctl daemon-reload 完成重载与应用。

 

4、unit

systemd的核心概念,一个unit文件,就是systemd控制一个对象的配置文件

 

4.1、unit类型

  • service,用于定义系统服务

  • target,用于模拟实现“运行级别”,将多个单元聚合在一起同时启动,类似组。

  • device,用于定义内核识别的设备

  • mount,用于定义文件系统挂载点

  • socket,用于标识进程间通讯用的socket文件

  • swap,用于标识swap设备

  • path,文件路径

  • timer,计时器

 

#列出系统中的所有单元

systemctl list-units --all

 

#只查看service这个单元的所有对象

systemctl list-units --type=service 

 

#列出系统中的所有服务状态,是否开机自动启动

systemctl list-unit-files

  • disable 开机不启动

  • enable 开机启动

  • masked 隔离单元对象

  • static 无法执行的对象,只作为单次运行

 

#查看所有单元

systemctl -t help  

 

5、systemctl

5.1、常用命令

#查看httpd服务的依赖关系

systemctl list-dependencies httpd.service

 

#查看服务状态

systemctl status httpd.service

Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled)

  • loaded 是否加载过这个单元对象的配置文件

  • 括号中,前面部分为配置文件,后面的enabled表示开机启动

 

Active: active (running)

  • 表示这个服务正在运行

  • 把这个服务stop之后,就是kill掉这个进程

 

#设置开机启动

systemctl enable httpd.service

 

#取消开机启动

systemctl disable httpd.service

 

#启动服务

systemctl start httpd.service

 

#停止服务

systemctl stop httpd.service

 

#重启服务

systemctl restart httpd.service

 

#尝试重启服务

#意思是,如果这个服务已经启动了,就停止再启动,如果本身就没有启动,直接启动

systemctl try-restart httpd.service

 

#不关闭服务,重新加载配置文件

systemctl reload httpd.service

 

#查看服务是否激活

systemctl is-active httpd.service

 

#查询是否开机启动

systemctl is-enabled httpd.service

 

5.2、运行级别

System V init

运行级别

systemd目标名称

作用

0

runlevel0.target -> poweroff.target

关机

1

runlevel1.target -> rescue.target

单用户模式

2

runlevel2.target -> multi-user.target

等同于级别3

3

runlevel3.target -> multi-user.target

多用户的文本界面

4

runlevel4.target -> multi-user.target

等同于级别3

5

runlevel5.target -> graphical.target

多用户的图形界面

6

runlevel6.target -> reboot.target

重启

emergency

emergency.target

紧急shell

 

#级别切换

systemctl isolate multiuser.target

 

#查看默认启动级别

systemctl get-default

 

#设置默认命令行

systemctl set-default multi-user.target

 

#设置默认图形化

systemctl set-default graphical.target

 

#屏蔽服务,也就是无论如何,也不允许某个服务启动,一般用于两个服务冲突,只能起一个,把另一个屏蔽

systemctl mask iptables.service

 

#解除屏蔽

systemctl unmask iptables.service

 

#重新加载单元,主要在修改了单元文件后,需要重新加载

systemctl daemon-reload

 

5.3、其它命令

#关机

systemctl halt

systemctl poweroff

 

#重启

systemctl reboot

 

#挂起,也就是系统不运行了,但不关机

systemctl suspend

 

#创建系统快照,重启后,会自动恢复快照

systemctl snapshot

 

#创建快照后挂起

systemctl hybrid-sleep

 

注意:

  • 不是由systemd启动的服务,systemctl不能与之通信

 

6、unit单元文件

#查看sshd的单元文件内容

systemctl cat sshd

 

#同上

cat /usr/lib/systemd/system/sshd.service

 

整个单元文件由三个部分组成:

  • [Unit]:记录unit文件的通用信息。

  • [Service]:记录Service的信息

  • [Install]:安装信息。

 

6.1、Unit

字段

解释

Description

对本service的描述

Before, After

定义启动顺序,Before=xxx.service,代表本服务在xxx.service启动之前启动。After=xxx.service,代表本服务在xxx之后启动

Requires

这个单元启动了,那么它“需要”的单元也会被启动; 它“需要”的单元被停止了,它自己也活不了。但是请注意,这个设定并不能控制某单元与它“需要”的单元的启动顺序(启动顺序是另外控制的),即 Systemd 不是先启动 Requires 再启动本单元,而是在本单元被激活时,并行启动两者。于是会产生争分夺秒的问题,如果 Requires 先启动成功,那么皆大欢喜; 如果 Requires 启动得慢,那本单元就会失败(Systemd 没有自动重试)。所以为了系统的健壮性,不建议使用这个标记,而建议使用 Wants 标记。可以使用多个 Requires

Wants

推荐使用。本单元启动了,它“想要”的单元也会被启动。但是启动不成功,对本单元没有影响

Conflicts

一个单元的启动会停止与它“冲突”的单元,反之亦然

 

6.2、Service

字段

解释

Type

service的种类,包含下列几种类型:

usimple,默认,这是最简单的服务类型。意思就是说启动的程序就是主体程序,这个程序要是退出那么一切都退出。

uforking,标准 Unix Daemon 使用的启动方式。启动程序后会调用 fork() 函数,把必要的通信频道都设置好之后父进程退出,留下守护精灵的子进程

uoneshot,一次性任务,启动随后立即退出的服务

udbus,这个程序启动时需要获取一块DBus空间,所以需要和BusName= 一起用。只有它成功获得了 DBus 空间,依赖它的程序才会被启动

 

EnvironmentFile

指定当前服务的环境参数文件。该文件内部的key=value键值对,可以用$key的形式,在当前配置文件中获取

ExecStart

服务启动时执行的命令,通常此命令就是服务的主体。

如果你服务的类型不是 oneshot,那么它只可以接受一个命令,参数不限。

多个命令用分号隔开,多行用 \ 跨行

ExecStartPre

ExecStart执行前调用的命令

ExecStartPost

ExecStart执行后所调用的命令

ExecStop

定义停止服务时所执行的命令,定义服务退出前所做的处理。如果没有指定,使用systemctl stop xxx命令时,服务将立即被终结而不做处理

ExecReload

重启服务时执行的命令

Restart

何种情况下,Systemd会自动重启当前服务:

uno(默认值):退出后不会重启

uon-success:只有正常退出时(退出状态码为0),才会重

uon-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启

 

uon-abnormal:只有被信号终止和超时,才会重启

uon-abort:只有在收到没有捕捉到的信号终止时,才会重启

uon-watchdog:超时退出,才会重启

ualways:不管是什么退出原因,总是重启

 

RestartSec

自动重启当前服务间隔的秒数

RemainAfterExit

值为yes,表示进程退出以后,服务仍然保持执行

TimeoutSec

定义 Systemd 停止当前服务之前等待的秒数

PermissionsStartOnly

设为 yes 表示所有与权限相关的执行选项(例如 User= 之类的选项),仅对ExecStart= 中的程序有效,而对 ExecStartPre=, ExecStartPost=,ExecReload=, ExecStop=, ExecStopPost= 中的程序无效。

默认值 no 表示所有与权限相关的执行选项, 对所有 Exec*= 系列选项中的程序都有效。

 

6.3、Install

字段

解释

WantedBy

何种情况下,服务被启用

WantedBy=multi-user.target(多用户环境下启用)

Alias

别名

 

6.4、实验

给自定义的脚本,写一个unit配置文件,实现systemd管理该脚本的启动、停止、开机自动运行等。

 

vi /mnt/test.sh

#!/bin/bash

echo hello > /mnt/f1

 

vi /usr/lib/systemd/system/demo.service

[Unit]

Description=MyDemo Service

 

[Service]

Type=oneshot

ExecStart=/bin/bash /mnt/test.sh

RemainAfterExit=yes

 

[Install]

WantedBy=multi-user.target

 

systemctl start demo.service