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