Linux系统中的bash 进程和init进程还有systemd进程分别有什么作用,他们之间有什么联系?

Linux系统中的bash进程、init进程和systemd进程都是一种守护进程(daemon),即在后台运行的进程,为系统提供各种服务。

  • bash 进程是一种命令行解释器,它可以执行用户输入的命令或者脚本文件,提供用户与系统的交互界面。bash进程通常是用户登录后启动的,每个用户可以有多个bash进程。
  • init 进程是Linux系统的第一个进程,它的进程号(PID)为1,它负责启动和停止系统的其他进程。init进程是系统的根进程,所有的进程都是它的后代。init进程使用一系列的启动脚本来控制系统的运行级别和服务。
  • systemd 进程是一种新的初始化系统,它取代了init进程,成为系统的第一个进程(PID为1),它的目的是提供更快速和更灵活的启动方式。systemd进程使用一种叫做Unit的资源单位来管理系统的各种服务,它可以并行启动多个服务,缩短系统的启动时间。

bash进程、init进程和systemd进程之间的联系是:

  • bash进程是systemd进程的子进程,systemd进程是init进程的替代品
  • bash进程可以通过systemctl命令来控制systemd进程管理的服务,也可以通过service命令来控制init进程管理的服务。
  • systemd进程可以兼容init进程的启动脚本,也可以使用自己的配置文件来定义服务。

如果您想了解更多关于Linux系统中的进程的信息,您可以参考以下的网页:

(1) linux的systemd与init的区别_systemd和init的区别-CSDN博客. https://blog.csdn.net/zhizhengguan/article/details/111653573.
(2) 【003】一文全面掌握Linux初始化进程(超详细) - 知乎专栏. https://zhuanlan.zhihu.com/p/298087838.
(3) linux---systemd进程 - 盗哥泡茶去了 - 博客园. https://www.cnblogs.com/1016391912pm/p/12953781.html.
(4) init和systemd:Linux守护进程 - 知乎 - 知乎专栏. https://zhuanlan.zhihu.com/p/561776400.


以下为转载

【003】一文全面掌握Linux初始化进程(超详细) - 知乎

本文将详细梳理Linux系统的初始化进程**systemd**。通过对此进程的理解,你将对系统的初始化有一个深入的理解,从而更好地理解其它的操作。

Linux系统的开机过程是这样的:从BIOS开始,进入Boot Loader,再加载内核系统,进行内核初始化,最后启动初始化进程。以前Linux的启动一直是采用init进程的,启动服务的方式如下:

$sudo /etc/init.d/apache2 start
或者
$service apache2 start 

init 启动方式有两个缺点

一是启动时间长,init进程是串行启动,只有前一个进程启动完成,才会启动下一个进程;

二是启动脚本复杂,init进程只执行启动脚本 ,不管其它事情,脚本需要处理各种情况,从而使得脚本变得很长。

1.systemd概述

根据Linux惯例,字母d是守护进程(daemon)的缩写systemd的含义是它要守护整个系统。 systemd是为了解决initd的缺点问题而诞生的, 它为系统的启动和管理提供了一套完整的解决方案。

使用systemd就不再需要initd了,它成了系统的第一个进程(PID= 1),其它进程都是它的子进程。

systemd初始化进程服务采用并发启动机制,开机速度得到了很大的提升。

可以用命令$ systemctl --version命令 查看systemd的版本。

systemd的优点是功能强大,使用方便,其缺点是体系庞大,非常复杂,与操作系统的其它部分强耦合,下图是systemd的体系架构图。

2. systemd对系统的管理

systemd并不是一个命令,而是一组命令,涉及到对系统各方面的管理。

  • systemctlsystemd的主命令,用于管理系统。其常用的操作如下:
bash 复制代码
# 重启系统
$ sudo systemctl reboot

# 关闭系统,切断电源
$ sudo systemctl poweroff

# CPU停止工作
$ sudo systemctl halt

# 暂停系统
$ sudo systemctl suspend

# 让系统进入冬眠状态
$ sudo systemctl hibernate

# 让系统进入交互式休眠状态
$ sudo systemctl hybrid-sleep

# 启动进入救援状态(单用户状态)
$ sudo systemctl rescue
  • systemd-analyze命令用于查看启动时的耗时。其常用的操作如下:
bash 复制代码
# 查看启动耗时
$ systemd-analyze                                                                                       

# 查看每个服务的启动耗时
$ systemd-analyze blame

# 显示瀑布状的启动过程流
$ systemd-analyze critical-chain

# 显示指定服务的启动流
$ systemd-analyze critical-chain atd.service
  • hostnamectl命令用于查看当前主机的信息。其常用的操作如下:

    显示当前主机的信息

    $ hostnamectl

    设置主机名。

    $ sudo hostnamectl set-hostname rhel8

  • localectl命令用于查看本地化设置。其常用的操作如下:

    查看本地化设置

    $ localectl

    设置本地化参数。

    $ sudo localectl set-locale LANG=en_GB.utf8
    $ sudo localectl set-keymap en_GB

  • timedatectl命令用于查看当前时区设置。其常用的操作如下:

    查看当前时区设置

    $ timedatectl

    显示所有可用的时区

    $ timedatectl list-timezones

    设置当前时区

    $ sudo timedatectl set-timezone America/New_York
    $ sudo timedatectl set-time YYYY-MM-DD
    $ sudo timedatectl set-time HH:MM:SS

  • loginctl命令用于查看当前登录用户的相关信息。其常用的操作如下:

    列出当前session

    $ loginctl list-sessions

    列出当前登录用户

    $ loginctl list-users

    列出显示指定用户的信息

    $ loginctl show-user wujitao

3. 资源单位Unit

systemd可以管理所有的系统资源,不同的资源统称为UnitLinux系统中Unit可以分为12种,列表如下:

uUnit 说明
Service Unit 系统服务
Target Unit 多个Unit构成一个组
Device Unit 硬件设备
Mount Unit 文件系统的挂载点
Automount Unit 自动挂载点
Path Unit 文件或路径
Scope Unit 不是由systemd启动的外部进程
Slice Unit 进程组
Snapshot Unit systemd快照,可以切回某个快照
Socket Unit 进程间通信的socket
Swap Unit swap文件
Timer Unit 定时器

用systemctl list-units命令可以查看当前系统的所有Unit。其常用的操作如下:

# 列出正在运行的 Unit
$ systemctl list-units

# 列出所有Unit,包括没有找到配置文件的或者启动失败的
$ systemctl list-units --all

# 列出所有没有运行的 Unit
$ systemctl list-units --all --state=inactive

# 列出所有加载失败的 Unit
$ systemctl list-units --failed

# 列出所有正在运行的、类型为 service 的 Unit
$ systemctl list-units --type=service

可以用systemctl status命令查看系统状态和单个Unit的状态。其常用操作如下:

bash 复制代码
# 显示系统状态
$ systemctl status

# 显示单个 Unit 的状态
$ sysystemctl status bluetooth.service

# 显示远程主机的某个 Unit 的状态
$ systemctl -H root@rhel8.redhat.com status httpd.service

# 显示某个 Unit 是否正在运行
$ systemctl is-active application.service

# 显示某个 Unit 是否处于启动失败状态
$ systemctl is-failed application.service

# 显示某个 Unit 服务是否建立了启动链接
$ systemctl is-enabled application.service

对一用户来说,最常用的操作就是启动或停止Unit (主要是service)。下面列出一常用的操作:

bash 复制代码
# 立即启动一个服务
$ sudo systemctl start apache.service

# 立即停止一个服务
$ sudo systemctl stop apache.service

# 重启一个服务
$ sudo systemctl restart apache.service

# 杀死一个服务的所有子进程
$ sudo systemctl kill apache.service

# 重新加载一个服务的配置文件
$ sudo systemctl reload apache.service

# 重载所有修改过的配置文件
$ sudo systemctl daemon-reload

# 显示某个 Unit 的所有底层参数
$ systemctl show httpd.service

# 显示某个 Unit 的指定属性的值
$ systemctl show -p CPUShares httpd.service

# 设置某个 Unit 的指定属性
$ sudo systemctl set-property httpd.service CPUShares=500

Unit之间存在依赖关系,比如A依赖于B,这意味着在systemd启动A时,会同时去启动B。可以用$ systemctl list-dependencies命令列出一个Unit的所有依赖,如下所示:

#列出蓝牙服务的所有依赖资源
$ systemctl list-dependencies --all bluetooth.service
#-all参数用来展开target,若不想展开,则可去掉

4. Unit的配置文件

每个Unit都有一个配置文件,告诉systemd如何启动这个Unit

systemd默认从目录/etc/systemd/system中读取配置文件,但这个目录中大部分是软链接文件,真正的配置文件存放在目录/usr/lib/systemd/system/中。

配置文件的后缀名,表明就是该Unit的种类,若无后缀名,则用默认后缀名.service

可以用systemctl enablesystemctl disable命令在两个目录间建立或取消符号链接,如下示例:

#建立符号链接
$ sudo systemctl enable atd.service
# 等同于
$ sudo ln -s '/usr/lib/systemd/system/atd.service' '/etc/systemd/system/atd.service'

#取消符号链接
$ sudo systemctl disable atd.service

可以用systemctl list-unit-files命令列出所有的配置文件,如下图所示:

可以看到每个配置文件的状态,其状态含义如下:

  • enabled:已建立启动链接;
  • disabled:未建立启动链接;
  • static:该配置文件没有install部分,只能作为其它配置文件的依赖;

注意,仅从配置文件状态还无法看出此Unit是否正在运行,必须执行systemctl status命令才可以。

对于目录下的配置文件,一旦修改,就必须让systemd重新加载配置文件,并重新启动,否则修改不会生效,其操作步骤如下:

#如修改了httpd的配置文件,要先重载,再重启
$ sudo systemctl daemon-reload
$ sudo systemctl restart httpd.service

配置文件就是普通的文本文件,可用systemctl cat命令查看配置文件的内容。 配置文件的完整字段清单可以参考**官方文档** 。

5. Target

systemdtarget代替了传统init启动模式里面的运行级别 的概念。每个target中包含多个Unit,这样启动某个target就会启动里面所有的Unit,从这个意义上说,target相当于一个"状态点",启动某个target就启动至某种状态。

注意 ,传统的运行级别是互斥的,不可能多个RunLevel同时启动,但是多个target可以同时启动。其常用的几个操作如下:

# 查看当前系统的所有 Target
$ systemctl list-unit-files --type=target

# 查看一个 Target 包含的所有 Unit
$ systemctl list-dependencies multi-user.target

# 查看启动时的默认 Target
$ systemctl get-default

# 设置启动时的默认 Target
$ sudo systemctl set-default multi-user.target

# 切换 Target 时,默认不关闭前一个 Target 启动的进程,
# systemctl isolate 命令改变这种行为,
# 关闭前一个 Target 里面所有不属于后一个 Target 的进程
$ sudo systemctl isolate multi-user.target

target与传统RunLevel的对应关系如下图所示:

若想要将系统默认的运行目标修改为"多用户无图形"模式,可直接用符号即可,命令如下:

$ sudo ln -sf /usr/lib/systemd/system/multi-user.target  /etc/systemd/system/default.target

6. 日志管理

systemd统一管理所有Unit的启动日志,带来的好处是,可以只用journalctl一个命令查看所有日志(包括内核日志和应用日志)。日志的配置文件是/etc/systemd/journald.conf。

journalctl的功能非常强大,其常用的操作如下示例:

bash 复制代码
# 查看所有日志(默认情况下 ,只保存本次启动的日志)
$ sudo journalctl

# 查看内核日志(不显示应用日志)
$ sudo journalctl -k

# 查看系统本次启动的日志
$ sudo journalctl -b
$ sudo journalctl -b -0

# 查看上一次启动的日志(需更改设置)
$ sudo journalctl -b -1

# 查看指定时间的日志
$ sudo journalctl --since="2020-10-01 18:18:18"
$ sudo journalctl --since "20 min ago"
$ sudo journalctl --since yesterday
$ sudo journalctl --since "2019-01-10" --until "2020-01-11 00:00"
$ sudo journalctl --since 09:00 --until "1 hour ago"

# 显示尾部的最新10行日志
$ sudo journalctl -n

# 显示尾部指定行数的日志
$ sudo journalctl -n 20

# 实时滚动显示最新日志
$ sudo journalctl -f

# 查看指定服务的日志
$ sudo journalctl /usr/lib/systemd/systemd

# 查看指定进程的日志
$ sudo journalctl _PID=1

# 查看某个路径的脚本的日志
$ sudo journalctl /usr/bin/bash

# 查看指定用户的日志
$ sudo journalctl _UID=33 --since today

# 查看某个 Unit 的日志
$ sudo journalctl -u nginx.service
$ sudo journalctl -u nginx.service --since today

# 实时滚动显示某个 Unit 的最新日志
$ sudo journalctl -u nginx.service -f

# 合并显示多个 Unit 的日志
$ journalctl -u nginx.service -u php-fpm.service --since today

# 查看指定优先级(及其以上级别)的日志,共有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.service -o json

# 以 JSON 格式(多行)输出,可读性更好
$ sudo journalctl -b -u nginx.serviceqq
 -o json-pretty

# 显示日志占据的硬盘空间
$ sudo journalctl --disk-usage

# 指定日志文件占据的最大空间
$ sudo journalctl --vacuum-size=1G

# 指定日志文件保存多久
$ sudo journalctl --vacuum-time=1years

7.systemd应用操作实战

若想设置某个服务在开机时启动,可以输入如下命令:

#设置开机启动httpd.service
$ sudo systemctl enable httpd

设置开机启动以后,服务并不会立即启动,必须等下一次开机,如果现在就想运行此服务,可用:

bash 复制代码
$ sudo systemctl start httpd

执行此命令后,服务也有可能启动失败,可用如下命令查看一下服务的状态:

$ sudo systemctl status httpd

若你想终止正在运行的服务,可以执行如下命令:

$ sudo systemctl stop httpd.service

当然有时可能此命令没有响应,服务也没有停下来,这时候不得不杀进程了,可用如下命令:

bash 复制代码
$ sudo systemctl kill httpd.service

也可以重启服务:

bash 复制代码
$sudo systemctl restart httpd.service

本文到此结束!下篇继续!

相关推荐
哎呦喂-ll40 分钟前
Linux进阶:环境变量
linux
Rverdoser41 分钟前
Linux环境开启MongoDB的安全认证
linux·安全·mongodb
PigeonGuan1 小时前
【jupyter】linux服务器怎么使用jupyter
linux·ide·jupyter
东华果汁哥1 小时前
【linux 免密登录】快速设置kafka01、kafka02、kafka03 三台机器免密登录
linux·运维·服务器
咖喱鱼蛋2 小时前
Ubuntu安装Electron环境
linux·ubuntu·electron
ac.char2 小时前
在 Ubuntu 系统上安装 npm 环境以及 nvm(Node Version Manager)
linux·ubuntu·npm
肖永威2 小时前
CentOS环境上离线安装python3及相关包
linux·运维·机器学习·centos
tian2kong2 小时前
Centos 7 修改YUM镜像源地址为阿里云镜像地址
linux·阿里云·centos
布鲁格若门2 小时前
CentOS 7 桌面版安装 cuda 12.4
linux·运维·centos·cuda