linux目录/usr/lib/systemd/system目录详解
创始人
2024-06-02 15:56:38
0

文章目录

  • 前言
  • 一. systemd介绍
  • 二. service 脚本详解
    • 2.1 [Unit] 区块
    • 2.2 [Service] 区块
    • 2.3 [Install] 区块
  • 总结

前言

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,一般有两种方法:

1、在/etc/systemd/system目录下创建nginx.service文件,里面写上我们自己的配置。

在/etc/systemd/system下面创建nginx.service.d目录,在这个目录里面新建任何以.conf结尾的文件,然后写入自己的配置。推荐这种做法。

2、/run/systemd/system这个目录一般是进程在运行时动态创建unit文件的目录,一般很少修改,除非是修改程序运行时的一些参数时,即Session级别的,才在这里做修改。

而 在/usr/lib/systemd/system目录自动存放启动文件的配置位置,里面一般包含有*.service的文件:

[root@mufeng system]# pwd 
/usr/lib/systemd/system
[root@mufeng system]# ls |head -2
abrt-ccpp.service
abrtd.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 daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=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字段:停止服务之后执行的命令

  1. 启动类型

Type字段定义启动类型。它可以设置的值如下:

  • simple(默认值):ExecStart字段启动的进程为主进程
  • forking:ExecStart字段将以fork()方式启动,此时父进程将会退出,子进程将成为主进程
  • oneshot:类似于simple,但只执行一次,Systemd 会等它执行完,才启动其他服务
  • dbus:类似于simple,但会等待 D-Bus 信号后启动
  • notify:类似于simple,启动结束后会发出通知信号,然后 Systemd 再启动其他服务
  • idle:类似于simple,但是要等到其他任务都执行完,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混合
  1. 重启行为

service 区块有些字段定义了重启行为

  1. KillMode字段:定义 Systemd 如何停止 sshd 服务。

上面这个例子中,将KillMode设为process,表示只停止主进程,不停止任何sshd 子进程,即子进程打开的 SSH session仍然保持连接。

这个设置不太常见,但对 sshd 很重要,否则你停止服务的时候,会连自己打开的 SSH session 一起杀掉.

KillMode字段可以设置的值如下。

  • control-group(默认值):当前控制组里面的所有子进程,都会被杀掉
  • process:只杀主进程
  • mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
  • none:没有进程会被杀掉,只是执行服务的 stop 命令。
  1. 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。

  1. 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-default
multi-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博客
💕 全力以赴,持续学习,不负如来不负卿

相关内容

热门资讯

三年级作文大全新学期的变化(... 三年级作文大全新学期的变化 篇一新学期的变化新学期开始了,我迎来了充满变化的三年级生活。和以前相比,...
寒假二三事三年级作文【精选3... 寒假二三事三年级作文 篇一快乐的寒假时光今年的寒假真是过得太快了,转眼间就要开学了。回顾这个寒假,我...
三年级作文350字关于动物【... 三年级作文350字关于动物 篇一我喜欢的动物我喜欢的动物是小狗。小狗有着可爱的外形和活泼的性格,让人...
公园中一天景色的变化作文三年... 公园中一天景色的变化作文三年级 篇一公园中一天景色的变化早晨,当阳光洒在公园上,天空变得湛蓝,白云朵...
三年级作文我是爸爸妈妈小帮手... 三年级作文我是爸爸妈妈小帮手 篇一我是爸爸妈妈小帮手我是一个三年级的小学生,虽然我还小,但我一直都很...
写博物馆的作文三年级【通用6... 写博物馆的作文三年级 篇一博物馆是一个神奇的地方,我最喜欢去博物馆看展览了。上周末,我和爸爸妈妈一起...
三年级我的妈妈的作文300字... 三年级我的妈妈的作文300字 篇一我亲爱的妈妈妈妈,您是我最亲爱的人,也是我最敬爱的人。在我成长的道...
小学三年级写景作文(经典6篇... 小学三年级写景作文 篇一美丽的春天春天来了,大自然仿佛换了一幅崭新的画,到处都是一片生机勃勃的景象。...
我班的活雷锋三年级作文【通用... 我班的活雷锋三年级作文 篇一我们班的小雷锋在我们班级里,有一个特别的小朋友,他就是我们的活雷锋。他叫...
海边作文300字三年级(精选... 海边作文300字三年级 篇一我喜欢海边,因为海边有美丽的沙滩、清澈的海水和各种有趣的海洋生物。每年暑...
三年级作文上学的路上开头【实... 三年级作文上学的路上开头 篇一一大早,天空还是微微泛着蓝色的时候,我便背上了书包,踏上了上学的征程。...
不起眼的主角作文【优选3篇】 不起眼的主角作文 篇一《小草的故事》有一天,我在花园里散步,突然发现一株小草。它生长在花园的角落,显...
家乡的环境作文三年级300字... 家乡的环境作文三年级300字20篇 篇一标题:我家乡的美丽环境我家乡是一个美丽的小镇,它位于山脚下,...
爸爸的作文【优质6篇】 爸爸的作文 篇一爸爸的作文今天是我第一次写作文,我选择写一篇关于我的爸爸的作文。爸爸是我心目中最伟大...
参观洛阳周王城天子驾六博物馆... 参观洛阳周王城天子驾六博物馆三年级作文 篇一我去洛阳参观了周王城天子驾六博物馆,感受到了历史的厚重和...
关于老师的一件事200字作文... 关于老师的一件事200字作文三年级作文 篇一今天是我上三年级的第一天,我迫不及待地走进了教室,想要见...
香水百合(通用4篇) 香水百合 篇一:追寻芬芳之旅香水百合,一种散发着迷人芬芳的花朵,常常被人们用来制作香水。它的美丽和独...
我们是一家人学生作文500字... 我们是一家人学生作文500字 篇一我们是一家人家,是一个温暖的港湾,是一个永远的归宿。在这个家庭中,...
你是我最崇拜的人小学作文(经... 你是我最崇拜的人小学作文 篇一我最崇拜的人是我的爸爸。他是一个非常了不起的人,他不仅是我的爸爸,还是...
小V过生日小学作文【实用3篇... 小V过生日小学作文 篇一我的好朋友小V过生日了!今天是她的生日,我早早地就起床了,准备给她一个惊喜。...