服务
服务是什么?
服务是常驻在内存中的程序,通常用于提供系统或网络功能,用于启动service的二进制文件称为daemon
init的服务管理
在Unix的system V版本中,启动服务的管理方式被称为SysV的init脚本程序处理方式,即系统核心第一个调用的程序为init,再由init调用其他服务
服务的开关和观察
所有服务启动脚本放置于 /etc/init.d
- 启动:/etc/init.d/daemon start
- 关闭:/etc/init.d/daemon stop
- 重启:/etc/init.d/daemon restart
- 观察:/etc/init.d/daemon status
服务的分类
- stand alone:服务独立启动,并常驻在内存中
- super daemon:由 xinetd或inetd 两个super daemon对socket、port管理,当有用户要求时才会去唤醒相对应的daemon,要求结束后服务也会结束
执行等级
init 根据用户的执行等级来调用不同的服务,从而进入不同的操作界面,等级为0-6,其启动脚本放置在 /etc/rc[0-6].d,连接到/init.d的daemon
命令 init [num] 可切换执行等级,其会自动启动 rc[0-6].d 的脚本
开机启动服务
根据上面,可知只要在 /etc/rc[0-6].d 下放置链接文件即可完成开机启动,也可使用如下命令
- 开机启动:chkconfig daemon on
- 取消开机启动:chkconfig daemon off
- 查看是否开机启动:chkconfig --list daemon
systemd的服务管理
systemd将daemon统称为服务unit,每种服务依据功能区分为不同type
相关文件
- /usr/lib/systemd/system:存放服务启动脚本
- /run/systemd/system:系统执行过程中产生的服务脚本,优先比上面高
- /etc/systemd/system:管理员依据系统需求所建立的脚本,优先级比上面高,这里面也是放置开机启动脚本的link文件
服务分类
后缀名 | 功能 |
---|---|
.service | 系统服务 |
.socket | 用于IPC(Inter-process communication)的传输信息,一般用于唤醒其他服务 |
.target | 用于执行一群服务的集合 |
.mount / .automount | 挂载相关服务 |
.path | 检查特定文件的服务,如打印服务 |
.timer | 循环执行的服务 |
利用systemctl管理服务
命令 systemctl [command] service用于统一管理服务
服务的开关
- start / stop / restart:开/关/重启服务
- reload:不关闭服务的情况下,重新载入设置文件
- enalbe / disable:开机自启及取消
- status:列出状态
- is-active:判断是否在允许
- is-enable:判断是否开机自启
如下 atd.service 状态enable表示可开机自启,状态active(running)表示正在运行
强制注销服务
如下,先关闭cup.service(该服务用于打印)
然后启动cup.socket
输出文字test用于打印,可看到cup.service被唤醒
服务具有相连性,cups.service会通过port 631来实现打印,但系统无需一直启动631端口,故多了一个cup.socket服务,这个服务用于监听端口,在用户有需要打印时会主动唤醒cups.service
解决办法是将cup.socket和cups.service一同关闭,或使用命令 mask 将cups.service注销
如上,使用mask后,cups.service无法再启动,取消注销则为unmask
服务的观察
命令 systemctl 默认加参数 list-units 列出已启动的服务,–all列出未启动的服务,list-unit-files 依据/usr/lib/systemd/system的文件进行解释,–type列出指定类型服务
- UNIT:项目名称
- LOAD:是否开机自启
- ACTIVE SUB:状态
- DESCRIPTION:描述
操作界面相关服务
systemd取消了原来执行等级的概念,转为使用不同的target操作环境
- graphical.target:文件加图形界面
- multi-user.target:文件界面
- rescue.target:维护界面
- emergency.target:救援界面,当上面无法使用时就用这个
- shutdown.target:关机流程
- getty.target:修改tty
命令 get-default 获取当前target,set-default设置默认target,isolate切换模式
服务相关性
命令 list-depencies即可列出当前服务的所使用的服务
如上可看到graphical.target用到multi-user.target,如下反向查找被哪些其他服务用到
服务介绍
可通过man systemd.service查看更具体介绍
Unit说明服务用途和相关性等:
- Description:说明
- Documentation:查询文件
- After:在某服务启动之后才启动此服务(非强制)
- Before:在某服务启动前启动此服务(非强制)
- Requires:在某服务启动之后才启动此服务(强制)
- Wants:在某服务启动之前才启动此服务(非强制)
- Conflicts:存在冲突的服务
Service说明服务启动脚本、环境等:
参数 | 说明 |
---|---|
Type | simple:ExecStart指令启动并常驻内存 forking:由fork启动 oneshot:ExecStart指令启动但只执行一次 |
EnvironmentFile | 指定启动脚本的环境配置文件 |
ExecStart | 启动服务的指令或脚本 |
ExecStop | 关闭服务的指令或脚本 |
ExecReload | reload的指令或脚本 |
Restart | 为1时服务停止后会再次启动,如tty登出后会再启动tty用于登入 |
TimeoutSec | 服务无法正常启动或关闭时,等待多久进入强制结束状态 |
RestartSec | 服务重启时间 |
Install说明服务的target等:
- WantedBy:后面接*.target,表示服务依附的target
- Also:表示当服务被enable时,指定的服务也会enable
- Alias:服务别名,如 systemctl set-default defalut.target相当于multi-user.target
制作Service
新建脚本backup.sh用于打包/etc
在/etc/systemd/system下新建back.service
接下来启动back.service,状态为inactive,因为脚本执行完并不会常驻内存,可看到生成了压缩包
制作timer
systemctl的timer也可实现定时执行的功能,可在/etc/systemd/system 下自定义 *.timer
参数 | 意义 |
---|---|
OnActiveSec | timers.targer启动多久后执行 |
OnBootSec | 开机多久后执行 |
OnStartupSec | systemd第一次启动多久后执行 |
OnUnitActiveSec | 距离上一次启动多久后再执行 |
OnUnitInactiveSec | 距离上一次停止多久后再执行 |
OnCalendar | 使用实际时间启动,格式为week YYYY-MM-DD HH:MM:SS |
Unit | 如果 .service和 .timer的名称不一样则需指定service |
Persistent | 是否持续运行 |
现需要:
- 开机后2小时执行/backup.service
- 距第一次执行后,未来每两天都要执行一次/backup.service
如下,只需要启动back.timer
如下
- 上一次执行backup.service的时间为2022-07-30 11:42:16
- 两天后执行backup.service的时间为2022-08-1 11:42:16
- 减去timer.target的时间2022-7-30 11:27:38
- 得2d 14min
如果使用OnCalendar指定时间,则NextElapseUSecRealtime为距1970-01-01 00:00:00的时间