架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3870|回复: 6

[linux] Linux systemd 服务管理器详解

[复制链接]
发表于 2021-11-28 10:02:32 | 显示全部楼层 |阅读模式
systemd 是一套用于 Linux 系统的基本构建块。它提供了一个系统和服务管理器,作为 PID 1 运行并启动系统的其余部分。

systemd 提供了积极的并行化能力,使用套接字和 D-Bus 激活来启动服务,提供守护进程的按需启动,使用 Linux 控制组跟踪进程,维护挂载和自动挂载点,并实现了精心设计的基于事务依赖的服务控制逻辑。systemd 支持 SysV 和 LSB init 脚本,并且可以替代 sysvinit。

其他部分包括日志守护程序、控制基本系统配置(如主机名、日期、区域设置)的实用程序,维护登录用户列表以及运行的容器和虚拟机、系统帐户、运行时目录和设置,以及管理简单网络的守护程序配置、网络时间同步、日志转发和名称解析。

systemd 配置文件存在于以下三个文件夹中:         

/etc/systemd/system 存放系统启动的默认级别及启动的unit的软连接,优先级最高。

/run/systemd/system 系统执行过程中产生的服务脚本,优先级次之。

/usr/lib/systemd/system 存放系统上所有的启动文件,优先级最低。
回顾:

Linux 查看 Systemd 服务的日志输出
https://www.itsvse.com/thread-10154-1-1.html

Jenkins(四)添加 Linux 节点并注册成服务
https://www.itsvse.com/thread-10120-1-1.html

CentOS 7 安装 Node exporter
https://www.itsvse.com/thread-9969-1-1.html

Unit 配置文件

systemd 中的 Unit(配置)文件是对 systemd 可以管理的各种单元(包括服务、套接字、设备等)的信息进行编码的文件。本指南侧重于服务,在这种情况下,我们操作的单元文件就是.service文件。该varnish.service设备配置文件包含有关systemd应该如何执行,监控和管理的清漆守护进程的信息。

[Unit]区块通常是配置文件的第一个区块,用来定义 Unit 的元数据,以及配置与其他 Unit 的关系。它的主要字段如下。

  • Description:简短描述
  • Documentation:文档地址
  • Requires:当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败
  • Wants:与当前 Unit 配合的其他 Unit,如果它们没有运行,当前 Unit 不会启动失败
  • BindsTo:与Requires类似,它指定的 Unit 如果退出,会导致当前 Unit 停止运行
  • Before:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之后启动
  • After:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之前启动
  • Conflicts:这里指定的 Unit 不能与当前 Unit 同时运行
  • Condition...:当前 Unit 运行必须满足的条件,否则不会运行
  • Assert...:当前 Unit 运行必须满足的条件,否则会报启动失败

[Install]通常是配置文件的最后一个区块,用来定义如何启动,以及是否开机启动。它的主要字段如下。

  • WantedBy:它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中
  • RequiredBy:它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中
  • Alias:当前 Unit 可用于启动的别名
  • Also:当前 Unit 激活(enable)时,会被同时激活的其他 Unit

[Service]区块用来 Service 的配置,只有 Service 类型的 Unit 才有这个区块。它的主要字段如下。

  • Type:定义启动时的进程行为。它有以下几种值。
  • Type=simple:默认值,执行ExecStart指定的命令,启动主进程
  • Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出
  • Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行
  • Type=dbus:当前服务通过D-Bus启动
  • Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行
  • Type=idle:若有其他任务执行完毕,当前服务才会运行
  • ExecStart:启动当前服务的命令
  • ExecStartPre:启动当前服务之前执行的命令
  • ExecStartPost:启动当前服务之后执行的命令
  • ExecReload:重启当前服务时执行的命令
  • ExecStop:停止当前服务时执行的命令
  • ExecStopPost:停止当其服务之后执行的命令
  • RestartSec:自动重启当前服务间隔的秒数
  • Restart:定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog
  • TimeoutSec:定义 Systemd 停止当前服务之前等待的秒数
  • Environment:指定环境变量

Systemctl 管理工具

CentOS 的程序管理基本上都是由工具 systemctl 完成。

启动服务:

systemctl start name.service

停止服务:

systemctl stop name.service

重启服务:

systemctl restart name.service

查看状态:

systemctl status name.service

条件式重启:

即服务之前是启动的则进行重启,如果服务没有启动则不进行操作

systemctl try-restart name.service

重载或重启:

首先进行重载,如果重载不成功则进行重启

systemctl reload-or-restart name.service

重载或条件式重启:

systemctl reload-or-try-restart name.service

设置服务是否可以被用户设置开机启动状态

systemctl unmask name.service  取消禁止

systemctl mask name.service 禁止

查看服务的当前激活状态:

服务已经启动命令的状态返回值为0 命令未启动命令的状态返回值为非0值

systemctl is-active name.service

查看所有已经激活的服务:

-t 指定显示的unit类型。

--all 显示更加详细的信息列表。

-a 等价 --all

systemctl list-units

systemctl list-units -t service

systemctl list-units -t service -a

查看所有服务:

systemctl list-units  -a

查看所有服务状态:

systemctl list-unit-files

-a 、--all : 查看所有服务的状态

-t 、--type :指定需要查看的unit类型

loaded :配置文件已经加载,载入内存

active(running):一次或多次持续处理的运行

active(exited):成功完成一次性的配置

active(waiting):运行中,等待一个事件

inactive:不运行

enabled:开机启动

disabled:开机不启动

static:开机不启动,但可被另一个启用的服务激活

用来列出该服务在哪些运行级别下启用和禁用

ls /etc/systemd/system/*.wants/sshd.service

systemctl list-unit-files --type target --all

设置服务开机不启动:

systemctl disable 服务名称unit

查看服务是否开机自启:

systemctl is-enabled name.service

察看服务的依赖关系:

systemctl list-dependencies name.service
systemctl list-depebdencies

重载服务:

systemctl daemon-reload

杀掉进程:

systemctl kill 进程名

参考资料:

https://blog.csdn.net/weixin_33812433/article/details/92656944
https://docs.varnish-software.com/tutorials/configuring-systemd-services/
https://www.digitalocean.com/community/tutorials/understanding-systemd-units-and-unit-files
https://www.cnblogs.com/mhc-fly/p/8512491.html





上一篇:Linux 使用 Curl 命令测试 LDAP 连通性
下一篇:vsftp 上传文件权限问题
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2021-12-11 17:35:26 | 显示全部楼层
[Unit]区块通常是配置文件的第一个区块,用来定义 Unit 的元数据,以及配置与其他 Unit 的关系。它的主要字段如下。

Description:简短描述
Documentation:文档地址
Requires:当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败
Wants:与当前 Unit 配合的其他 Unit,如果它们没有运行,当前 Unit 不会启动失败
BindsTo:与Requires类似,它指定的 Unit 如果退出,会导致当前 Unit 停止运行
Before:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之后启动
After:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之前启动
Conflicts:这里指定的 Unit 不能与当前 Unit 同时运行
Condition...:当前 Unit 运行必须满足的条件,否则不会运行
Assert...:当前 Unit 运行必须满足的条件,否则会报启动失败
[Install]通常是配置文件的最后一个区块,用来定义如何启动,以及是否开机启动。它的主要字段如下。

WantedBy:它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中
RequiredBy:它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中
Alias:当前 Unit 可用于启动的别名
Also:当前 Unit 激活(enable)时,会被同时激活的其他 Unit
[Service]区块用来 Service 的配置,只有 Service 类型的 Unit 才有这个区块。它的主要字段如下。

Type:定义启动时的进程行为。它有以下几种值。
Type=simple:默认值,执行ExecStart指定的命令,启动主进程
Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出
Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行
Type=dbus:当前服务通过D-Bus启动
Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行
Type=idle:若有其他任务执行完毕,当前服务才会运行
ExecStart:启动当前服务的命令
ExecStartPre:启动当前服务之前执行的命令
ExecStartPost:启动当前服务之后执行的命令
ExecReload:重启当前服务时执行的命令
ExecStop:停止当前服务时执行的命令
ExecStopPost:停止当其服务之后执行的命令
RestartSec:自动重启当前服务间隔的秒数
Restart:定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog
TimeoutSec:定义 Systemd 停止当前服务之前等待的秒数
Environment:指定环境变量


码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2021-12-11 17:37:33 | 显示全部楼层
Type=forking
systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便 systemd 能够跟踪服务的主进程

码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2021-12-15 16:55:14 | 显示全部楼层
EnvironmentFile 指令

EnvironmentFile 类似于 Environment 指令,但从文本文件中读取环境变量。文本文件应包含以换行符分隔的变量赋值

示例

可以获取此环境文件并使用其变量,如下:



码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2022-1-4 15:56:55 | 显示全部楼层
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2022-1-5 09:48:21 | 显示全部楼层
docker 默认服务文件路径 /usr/lib/systemd/system/docker.service

码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2022-1-23 22:57:56 | 显示全部楼层
查看所有服务状态



查询某个服务是否开机启动,以 nfs 为例:

码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-19 15:50

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表