linux目录/usr/lib/systemd/system目录详解
文章目录
前言
init
的进化经历了这么几个阶段:
-
CentOS 5: SysV init,串行
-
CentOS 6:Upstart,并行,借鉴ubuntu
-
CentOS 7:Systemd,并行,借鉴MAC
今天我们一起来看看systemd的使用
一. systemd介绍
Systemd
新特性:
(1)系统引导时实现服务并行启动:服务间无依赖关系会并行启动
(2)按需激活进程:若服务非立刻使用,不会立刻激活,处于半活动状态,占用端口用时启动服务
(3)系统状态快照:回滚到过去某一状态
(4)基于依赖关系定义服务控制逻辑
CentOS 7的服务systemctl脚本存放在:/usr/lib/systemd/,有系统 system 和用户 user 之分, 即:/usr/lib/systemd/system 和 /usr/lib/systemd/user
这里先说明一下unit的文件位置,一般主要有三个目录:
- /lib/systemd/system
- /run/systemd/system
- /etc/systemd/system
这三个目录的配置文件优先级依次从低到高,如果同一选项三个地方都配置了,优先级高的会覆盖优先级低的。
系统安装时,默认会将unit文件放在/lib/systemd/system目录。
如果想要修改系统默认的配置,比如nginx.service,一般有两种方法:
在/etc/systemd/system目录下创建nginx.service文件,里面写上我们自己的配置。
在/etc/systemd/system下面创建nginx.service.d目录,在这个目录里面新建任何以.conf结尾的文件,然后写入自己的配置。推荐这种做法。
/run/systemd/system这个目录一般是进程在运行时动态创建unit文件的目录,一般很少修改,除非是修改程序运行时的一些参数时,即Session级别的,才在这里做修改。
而 在/usr/lib/systemd/system目录自动存放启动文件的配置位置,里面一般包含有*.service的文件:
[root@mufeng system]# pwd /usr/lib/systemd/system[root@mufeng system]# ls |head -2abrt-ccpp.serviceabrtd.service
当我们利用systemctl 查看服务状态的时候,就会出现/usr/lib/systemd/system/mysql.service,我们用systemctl命令操作mysqld服务其实就是操作mysql.service文件
调用该文件即可启动该服务。
上面的输出结果含义如下。
- Loaded行:配置文件的位置,是否设为开机启动
- Active行:表示正在运行
- Main PID行:主进程ID
- Status行:由应用本身提供的软件当前状态(sshd这里没有)
- CGroup块:应用的所有子进程
- 日志块:应用的日志
其他的服务有的有status,比如httpd
二. service 脚本详解
我们打开ssh的.service
来查看:
[root@mufeng system]# cat sshd.service [Unit]Description=OpenSSH server daemonDocumentation=man:sshd(8) man:sshd_config(5)After=network.target sshd-keygen.serviceWants=sshd-keygen.service[Service]Type=notifyEnvironmentFile=/etc/sysconfig/sshdExecStart=/usr/sbin/sshd -D $OPTIONSExecReload=/bin/kill -HUP $MAINPIDKillMode=processRestart=on-failureRestartSec=42s[Install]WantedBy=multi-user.target
可以看到service脚本是由三个部分组成的:[Unit]``````[Service] ``````[Install]
2.1 [Unit] 区块
定义与Unit类型无关的通用选项;用于提供unit的描述信息、unit行为及依赖关系等;
所以这个板块负责启动顺序与依赖关系。
常用选项:
-
Description:描述信息;意义性描述;
-
After:定义unit的启动次序;表示当前unit应该晚于哪些unit启动;其功能与Before相反;
-
Requies:依赖到的其它units;强依赖,被依赖的units无法激活时,当前unit即无法激活;
-
Wants:依赖到的其它units;弱依赖;
-
Conflicts:定义units间的冲突关系;
在本文的截图中,是sshd服务的相关配置,有以下几个选项:
- Description字段给出当前服务的简单描述
- Documentation字段给出文档位置。
接下来的设置是启动顺序和依赖关系,这部分比较重要:
- After字段:表示如果network.target或sshd-keygen.service需要启动,那么sshd.service应该在它们之后启动。
相应地,还有一个Before字段,定义sshd.service应该在哪些服务之前启动。
注意: After和Before字段只涉及启动顺序,不涉及依赖关系
举例来说,某 Web 应用需要 postgresql 数据库储存数据。在配置文件中,它只定义要在 postgresql 之后启动,而没有定义依赖 postgresql 。
上线后,由于某种原因,postgresql 需要重新启动,在停止服务期间,该 Web 应用就会无法建立数据库连接。
设置依赖关系,需要使用Wants字段和Requires字段。
-
Wants字段:表示sshd.service与sshd-keygen.service之间存在"弱依赖"关系,即如果"sshd-keygen.service"启动失败或停止运行,不影响sshd.service继续执行。
-
Requires字段则表示"强依赖"关系,即如果该服务启动失败或异常退出,那么sshd.service也必须退出。
注意,Wants字段与Requires字段只涉及依赖关系,与启动顺序无关,默认情况下是同时启动的
2.2 [Service] 区块
Service区块
定义如何启动当前服务
service 段的常用选项:
Type:用于定义影响ExecStart及相关参数的功能的unit进程启动类型;类型种类:simple:默认。由ExecStart指明的进程所启动起来进程为主进程forking:由ExecStart所启动的进程生成的一个子进程为主,父进程退出oneshot:一次性的启动,后续的unit进程启动后,该进程退出dbus:仅在得到dbus之后才推出notify:发送通知以后才能运行idle:类似于simpleEnvironmentFile:环境配置文件,为ExecStart提供一些变量;ExecStart:指明启动unit要运行命令或脚本;ExecStartPre, ExecStartPostExecStop:指明停止unit要运行的命令或脚本;Restart:启动此项,意外终止会自动重启脚本
1. 启动命令
许多软件都有自己的环境参数文件,该文件可以用EnvironmentFile字段读取。
- EnvironmentFile字段:指定当前服务的环境参数文件。
该文件内部的key=value键值对,可以用$key的形式,在当前配置文件中获取。
上面的例子中,sshd 的环境参数文件是/etc/sysconfig/sshd。
配置文件里面最重要的字段是ExecStart。
- ExecStart字段:定义启动进程时执行的命令。
上面的例子中,启动sshd,执行的命令是/usr/sbin/sshd -D $OPTIONS
其中的变量OPTIONS
就来自EnvironmentFile
字段指定的环境参数文件。
与之作用相似的,还有如下这些字段:
-
ExecReload字段:重启服务时执行的命令
-
ExecStop字段:停止服务时执行的命令
-
ExecStartPre字段:启动服务之前执行的命令
-
ExecStartPost字段:启动服务之后执行的命令
-
ExecStopPost字段:停止服务之后执行的命令
- 启动类型
Type字段定义启动类型。它可以设置的值如下:
- simple(默认值):ExecStart字段启动的进程为主进程
- forking:ExecStart字段将以fork()方式启动,此时父进程将会退出,子进程将成为主进程
- oneshot:类似于simple,但只执行一次,Systemd 会等它执行完,才启动其他服务
- dbus:类似于simple,但会等待 D-Bus 信号后启动
- notify:类似于simple,启动结束后会发出通知信号,然后 Systemd 再启动其他服务
- idle:类似于simple,但是要等到其他任务都执行完,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混合
- 重启行为
service 区块有些字段定义了重启行为
- KillMode字段:定义 Systemd 如何停止 sshd 服务。
上面这个例子中,将KillMode
设为process
,表示只停止主进程,不停止任何sshd 子进程,即子进程打开的 SSH session
仍然保持连接。
这个设置不太常见,但对 sshd 很重要,否则你停止服务的时候,会连自己打开的 SSH session 一起杀掉.
KillMode字段可以设置的值如下。
- control-group(默认值):当前控制组里面的所有子进程,都会被杀掉
- process:只杀主进程
- mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
- none:没有进程会被杀掉,只是执行服务的 stop 命令。
- Restart字段:定义了 sshd 退出后,Systemd 的重启方式。
上面的例子中,Restart设为on-failure,表示任何意外的失败,就将重启sshd。如果 sshd 正常停止(比如执行systemctl stop命令),它就不会重启.
Restart字段可以设置的值如下:
- no(默认值):退出后不会重启
- on-success:只有正常退出时(退出状态码为0),才会重启
- on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启
- on-abnormal:只有被信号终止和超时,才会重启
- on-abort:只有在收到没有捕捉到的信号终止时,才会重启
- on-watchdog:超时退出,才会重启
- always:不管是什么退出原因,总是重启
对于守护进程,推荐设为on-failure。对于那些允许发生错误退出的服务,可以设为on-abnormal。
- RestartSec字段:表示 Systemd 重启服务之前,需要等待的秒数。上面的例子设为等待42秒。
2.3 [Install] 区块
Install区块,定义如何安装这个配置文件,即怎样做到开机启动。
- WantedBy字段:表示该服务所在的 Target。
- Target的含义是服务组,表示一组服务。WantedBy=multi-user.target指的是,sshd 所在的 Target 是multi-user.target。
这个设置非常重要,因为执行systemctl enable sshd.service命令时,sshd.service的一个符号链接,就会放在/etc/systemd/system目录下面的multi-user.target.wants子目录之中。
Systemd 有默认的启动 Target
systemctl get-defaultmulti-user.target
上面的结果表示,默认的启动 Target 是multi-user.target。在这个组里的所有服务,都将开机启动。这就是为什么systemctl enable命令能设置开机启动的原因
使用 Target 的时候,systemctl list-dependencies命令和systemctl isolate命令也很有用。
# 查看 multi-user.target 包含的所有服务$ systemctl list-dependencies multi-user.target# 切换到另一个 target# shutdown.target 就是关机状态$ sudo systemctl isolate shutdown.target
一般来说,常用的 Target 有两个:一个是multi-user.target,表示多用户命令行状态;另一个是graphical.target,表示图形用户状态,它依赖于multi-user.target。
总结
💕 好啦,这就是今天要分享给大家的全部内容了,我们下期再见!
💕 博客主页:mufeng.blog.csdn.net
💕 本文由沐风晓月原创,首发于CSDN博客
💕 全力以赴,持续学习,不负如来不负卿
来源地址:https://blog.csdn.net/wisdom_futrue/article/details/129484357
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341