草庐IT

Systemd简要介绍

LxFly 2023-03-28 原文

  Systemd为Linux中的初始化init系统,用于启动与停止服务进程,设计目标为:尽可能启动更少进程、更多进程并行启动;Systemd使用Linux的CGroup特性用来跟踪与管理进程的生命周期,在服务启动时会并发创建依赖的服务进程,子进程继承父进程CGroup相关服务进程归属与同一个CGroup。Systemd只需遍历CGroup即可找到所有相关进程,关闭所有依赖;
  Systemd具有快照与恢复的能力,可对系统当前运行状态创建快照,并可通过所创建的快照恢复所创建快照时系统的运行状态;Systemd带有日志服务journald,使用二进制格式保持日志信息可使用journalctl命令查看服务日志;

依赖消除

  Systemd的依赖消除,其将依赖定义为三种类别:Socket依赖、D-Bus依赖、文件系统依赖,每种依赖使用不同的技术手段进行消除;
  Socket依赖:服务AS通过Socket端口18080提供服务,其他服务如需使用服务AS需通过18080连接,此时如服务AS未启动套接字亦不存在,自然提供不了服务,此时就存在Socket依赖,在Systemd中启动其他服务无需等待AS服务启动,其会预先创建好Socket套接字共其他服务使用,其他服务发送的服务请求会在Linux中缓存,待服务AS启动后就会立即处理请求;Systemd所使用的是Linux的特性Fork或exec创建的子进程父进程所打开的所有文件句柄都被子进程继承;
  D-Bus依赖:D-Bus为高性能的进程间通讯机制,D-Bus支持bus activation功能,当服务需要使用服务C所提供的D-Bus服务时该服务C并没有启动,D-Bus可在服务请求服务C时自动启动服务B。
  文件系统依赖:Systemd使用了与autofs类似的思路,当某个文件系统挂载点被访问时才触发挂载操作,同时事先创建临时挂载点待真实设备挂载好后再替换挂载点;
  Systemd解除了部分依赖达到了服务并发启动的能力,但部分强依赖并不能完全消除,通过Unit定义服务间的依赖关系;

基本命令

  Systemd提供了:systemctl、systemd-analyze、hostnamectl、localectl、timedatetl、loginctl等命令,systemctl为管理系统的主命令;

Unit基本概念

  系统初始化时需要启动各类系统、用户服务,Systemd将所管理的系统资源统一称为Unit,目前Systemd有12中Unit:

Service Unit:系统服务
Target Unit:由多个Unit所构成
Device Unit:硬件设备
Mount Unit:文件系统挂载点
Automount Unit:自动挂载点
Path Unit:路径与文件
Scope Unit:非Systemd启动的进程
Slice Unit:进程组
Snapchat Unit:Systemd快照
Socket Unit:进程通信Socket
Swap Unit:Swap文件
Timer Unit:定时器

  Unit相关命令
  通过systemctl list-units可查看当前系统的所有Unit

systemctl status查看系统或服务的状态
systemctl start 启动服务
systemctl stop 停止服务
systemctl restart 重启服务
systemctl daemon-reload重新加载配置文件
systemctl list-dependencies 列出Unit的所有依赖

Unit的配置文件

  每个Unit都有一个配置文件,用于配置Systemd如何启动Unit,默认从/etc/systemd/system/目录读取配置文件,目前存放的只是符号链接,指向/usr/lib/systemd/system/存放配置文件的目录;使用systemctl enable xxx@xxx.service建立两个目录的符号链接,如配置了开机启动,enable会激活开机启动;
  配置文件名的后缀为Unit的种类,省略后缀默认后缀名为.service;

1、配置文件格式

  配置文件为文本文件,直接用编辑器打开编辑,一个简单的配置文件如下:分为三个区块组成:Unit、Service、Install,区块的内容为等号连接的键值对,可通过:systemctl cat xxx.service查看配置文件的内容;

[Unit]
Description=描述
[Service]
Type=forking
ExecStart=/usr/bin/sshd
[Install]
WantedBy=multi-user.target

2、配置文件区块

  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:指定环境变量

Target

  Target由多个Unit所组成,启动某个Target就启动了多个Unit,在系统初始化时只需启动某个Target即可;

systemctl list-unit-files --type=target  查看当前所有
systemctl list-dependencies multi-user.target 查看Target包含的所有Unit
systemctl get-default  查看启动时默认Target

日志

  Systemd 统一管理所有Unit日志,只用journalctl一个命令,查看所有日志(内核日志和应用日志),日志的配置文件是/etc/systemd/journald.conf。

查看所有日志(默认情况下 ,只保存本次启动的日志)
sudo journalctl
查看内核日志(不显示应用日志)
sudo journalctl -k
查看系统本次启动的日志
sudo journalctl -b

查看指定时间的日志
sudo journalctl --since "30 min ago"
sudo journalctl --since yesterday
sudo journalctl --since "2022-01-10" --until "2022-01-11 03:00"
显示尾部的最新10行日志
sudo journalctl -n
实时滚动显示最新日志
sudo journalctl -f
查看指定服务的日志
sudo journalctl /usr/lib/systemd/systemd
查看指定进程的日志
sudo journalctl _PID=1
查看某个路径的脚本的日志
sudo journalctl /usr/bin/bash
查看某个 Unit 的日志
sudo journalctl -u nginx.service
实时滚动显示某个 Unit 的最新日志
sudo journalctl -u nginx.service -f
查看指定优先级(及其以上级别)的日志,共有8级
# 0: emerg
# 1: alert
# 2: crit
# 3: err
# 4: warning
# 5: notice
# 6: info
# 7: debug
sudo journalctl -p err -b
日志默认分页输出,--no-pager 改为正常的标准输出
sudo journalctl --no-pager
以 JSON 格式(多行)输出,可读性更好
sudo journalctl -b -u nginx.serviceqq -o json-pretty
显示日志占据的硬盘空间
sudo journalctl --disk-usage
指定日志文件占据的最大空间
sudo journalctl --vacuum-size=1G
指定日志文件保存多久
sudo journalctl --vacuum-time=2years

文章首发地址:https://mp.weixin.qq.com/s/Xl0Vm57E7qd11wZzbCtEOQ

有关Systemd简要介绍的更多相关文章

  1. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  2. H2数据库配置及相关使用方式一站式介绍(极为详细并整理官方文档) - 2

    目录H2数据库入门以及实际开发时的使用1.H2数据库的初识1.1H2数据库介绍1.2为什么要使用嵌入式数据库?1.3嵌入式数据库对比1.3.1性能对比1.4技术选型思考2.H2数据库实战2.1H2数据库下载搭建以及部署2.1.1H2数据库的下载2.1.2数据库启动2.1.2.1windows系统可以在bin目录下执行h2.bat2.1.2.2同理可以通过cmd直接使用命令进行启动:2.1.2.3启动后控制台页面:2.1.3spring整合H2数据库2.1.3.1引入依赖文件2.1.4数据库通过file模式实际保存数据的位置2.2H2数据库操作2.2.1Mysql兼容模式2.2.2Mysql模式

  3. ruby - ruby、openssl、unicorn、systemd (Gcloud) 的非常奇怪的行为 - 2

    我们开始在日志中看到一些奇怪的错误,这些错误通常在ruby​​未使用OpenSSL正确编译时出现。但它不一致...我们收到如下错误:RuntimeError:不支持的摘要算法(SHA256)。(还有其他摘要,如sha1)。exampleerrortraceFaraday::SSLError(SSL_CTX_new:(null))exampleerrortrace我们在使用serviceunicornstart或systemctlstartunicorn启动unicorn时成功重现了它。但只有一些请求...不是全部。某些在后台使用OpenSSL的请求确实有效。其他人没有。但是,当我们使用

  4. Spring Cloud Gateway 服务网关的部署与使用详细介绍 - 2

    为什么需要服务网关传统的单体架构中只需要开放一个服务给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,如果没有网关,客户端只能在本地记录每个微服务的调用地址,当需要调用的微服务数量很多时,它需要了解每个服务的接口,这个工作量很大。有了网关之后,网关作为系统的唯一流量入口,封装内部系统的架构,所有请求都先经过网关,由网关将请求路由到合适的微服务。使用网关的好处1)简化客户端的工作。网关将微服务封装起来后,客户端只需同网关交互,而不必调用各个不同服务;(2)降低函数间的耦合度。一旦服务接口修改,只需修改网关的路由策略,不必修改每个调用该函数的客户端,从而减少了程序间的耦合性(3)解放开发

  5. ruby - Vim 详细介绍了 Rails 的自动完成功能 - 2

    我发现python的细节自动完成很好RubyonRails有类似的方法描述吗? 最佳答案 有篇不错的文章"UsingVIMasacompleteRubyonRailsIDE"其中引用rails.vim.这似乎是RailsforVIM的实际标准。(不过,我还没有使用过它,但很快就会尝试。)这允许你做很多与Rails相关的任务,但对自动完成没有帮助。还有一篇"RubyAutocompleteinVim"(遗憾的是不再可用)这就是您要搜索的内容。我不知道,理解Rails的所有插件魔法和元编程的东西是否足够聪明。它至少在vim的配置中提到了

  6. 华为防火墙简单介绍 - 2

    防火墙防火墙分类第一代防火墙:包过滤防火墙包过滤防火墙的缺点第二代防火墙:代理防火墙第三代防火墙:状态防火墙第四代防火墙:UTM防火墙第五代防火墙:下一代防火墙华为防火墙介绍安全策略防火墙的会话表防火墙分类第一代防火墙:包过滤防火墙属于第一代防火墙技术,在没有专用防火墙设备时,一般由路由器实现该功能。将网络上传送数据包的IP首部以及TCP/UDP首部,获取发送源的IP地址和端口号,以及目的地的IP地址和端口号,并将这些信息作为过滤条件,决定是否将该分组转发至目的地网络分组过滤的执行需要设置访问控制列表。访问控制列表也可以称为安全策略(简称策略)或安全规则(简称规则)。类似于进站检票的做法,符合

  7. Qt样式表之 QSS 语法介绍;QLineEdit、 - 2

     内容来自Qt样式表之QSS语法介绍-3YL的博客Qt样式表是一个可以自定义部件外观的十分强大的机制,可以用来美化部件。Qt样式表的概念、术语和语法都受到了HTML的层叠样式表(CascadingStyleSheets, CSS教程)的启发,不过与CSS不同的是,Qt样式表应用于部件的世界。类型选择器QPushButton匹配QPushButton及其子类的实例ID选择器QPushButton#okButton匹配所有objectName为okButton的QPushButton实例。 CSS常用样式1CSS文字属性注:px:相对长度单位,像素(Pixel)。pt:绝对长度单位,点(Point

  8. Android对话框的详细介绍(提示对话框,自定义对话框) - 2

    简介:我们都知道在Android开发中,当我们的程序在与用户交互时,用户会得到一定的反馈,其中以对话框的形式的反馈还是比较常见的,接下来我们来介绍几种常见的对话框的基本使用。前置准备:(文章最后附有所有代码)我们首先先写一个简单的页面用于测试这几种Dialog(对话框)代码如下,比较简单,就不做解释了一、提示对话框(即最普通的对话框)首先我们给普通对话框的按钮设置一个点击事件,然后通过AlertDialog.Builder来构造一个对象,为什么不直接Dialog一个对象,是因为Dialog是一个基类,我们尽量要使用它的子类来进行实例化对象,在实例化对象的时候,需要将当前的上下文传过去,因为我这

  9. 技术分享 | observer 资源水位介绍 - 2

    作者:郭斌斌爱可生DBA团队成员,负责项目日常问题处理及公司平台问题排查。本文来源:原创投稿*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。OceanBase集群界面会展示Observer的资源水位,今天简单了解一下资源水位的数值代表的含义以及关联参数现有test_1集群,只有一个sys租户Sys租户的资源配置:Cpu:2.5-5Memory:3G-3GUnit:1集群的资源水位信息以10.186.63.198为例,浅看一下cpu、内存、磁盘的含义以及相关联参数cpu:2.5/17核2.5代表observer上已经分配给租户的cpu核数,该数值是租户的MinCPU

  10. (一)专题介绍:移动端安卓手机改造成linux服务器&linux服务器中安装软件、部署前后端分离项目实战 - 2

    快捷目录前言一、涉及到的相关技术简介二、具体实现过程及踩坑杂谈1.安卓手机改造成linux系统实现方案2.改造后的手机Linux中软件的安装3.手机Linux中安装MySQL5.7踩坑实录4.手机Linux中安装软件的正确方法三、Linux服务器部署前后端分离项目流程1.前提准备(安装必要软件,搭建环境):2.前后端分离项目的详细部署过程:总结前言总体概述:本篇文章隶属于“手机改造服务器部署前后端分离项目”系列专栏,该专栏将分多个板块,每个板块独立成篇来详细记录:手机(安卓)改造成个人服务器(Linux)、Linux中安装软件、配置开发环境、部署JAVA+VUE+MySQL5.7前后端分离项目

随机推荐