当前位置:   article > 正文

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

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进程的,启动服务的方式如下:

  1. $sudo /etc/init.d/apache2 start
  2. 或者
  3. $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的主命令,用于管理系统。其常用的操作如下:
  1. # 重启系统
  2. $ sudo systemctl reboot
  3. # 关闭系统,切断电源
  4. $ sudo systemctl poweroff
  5. # CPU停止工作
  6. $ sudo systemctl halt
  7. # 暂停系统
  8. $ sudo systemctl suspend
  9. # 让系统进入冬眠状态
  10. $ sudo systemctl hibernate
  11. # 让系统进入交互式休眠状态
  12. $ sudo systemctl hybrid-sleep
  13. # 启动进入救援状态(单用户状态)
  14. $ sudo systemctl rescue
  • systemd-analyze命令用于查看启动时的耗时。其常用的操作如下:
  1. # 查看启动耗时
  2. $ systemd-analyze
  3. # 查看每个服务的启动耗时
  4. $ systemd-analyze blame
  5. # 显示瀑布状的启动过程流
  6. $ systemd-analyze critical-chain
  7. # 显示指定服务的启动流
  8. $ systemd-analyze critical-chain atd.service
  • hostnamectl命令用于查看当前主机的信息。其常用的操作如下:
  1. # 显示当前主机的信息
  2. $ hostnamectl
  3. # 设置主机名。
  4. $ sudo hostnamectl set-hostname rhel8
  • localectl命令用于查看本地化设置。其常用的操作如下:
  1. # 查看本地化设置
  2. $ localectl
  3. # 设置本地化参数。
  4. $ sudo localectl set-locale LANG=en_GB.utf8
  5. $ sudo localectl set-keymap en_GB
  • timedatectl命令用于查看当前时区设置。其常用的操作如下:
  1. # 查看当前时区设置
  2. $ timedatectl
  3. # 显示所有可用的时区
  4. $ timedatectl list-timezones
  5. # 设置当前时区
  6. $ sudo timedatectl set-timezone America/New_York
  7. $ sudo timedatectl set-time YYYY-MM-DD
  8. $ sudo timedatectl set-time HH:MM:SS
  • loginctl命令用于查看当前登录用户的相关信息。其常用的操作如下:
  1. # 列出当前session
  2. $ loginctl list-sessions
  3. # 列出当前登录用户
  4. $ loginctl list-users
  5. # 列出显示指定用户的信息
  6. $ 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 Unitsystemd快照,可以切回某个快照
Socket Unit进程间通信的socket
Swap Unitswap文件
Timer Unit定时器

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

  1. # 列出正在运行的 Unit
  2. $ systemctl list-units
  3. # 列出所有Unit,包括没有找到配置文件的或者启动失败的
  4. $ systemctl list-units --all
  5. # 列出所有没有运行的 Unit
  6. $ systemctl list-units --all --state=inactive
  7. # 列出所有加载失败的 Unit
  8. $ systemctl list-units --failed
  9. # 列出所有正在运行的、类型为 service 的 Unit
  10. $ systemctl list-units --type=service

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

  1. # 显示系统状态
  2. $ systemctl status
  3. # 显示单个 Unit 的状态
  4. $ sysystemctl status bluetooth.service
  5. # 显示远程主机的某个 Unit 的状态
  6. $ systemctl -H root@rhel8.redhat.com status httpd.service
  7. # 显示某个 Unit 是否正在运行
  8. $ systemctl is-active application.service
  9. # 显示某个 Unit 是否处于启动失败状态
  10. $ systemctl is-failed application.service
  11. # 显示某个 Unit 服务是否建立了启动链接
  12. $ systemctl is-enabled application.service

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

  1. # 立即启动一个服务
  2. $ sudo systemctl start apache.service
  3. # 立即停止一个服务
  4. $ sudo systemctl stop apache.service
  5. # 重启一个服务
  6. $ sudo systemctl restart apache.service
  7. # 杀死一个服务的所有子进程
  8. $ sudo systemctl kill apache.service
  9. # 重新加载一个服务的配置文件
  10. $ sudo systemctl reload apache.service
  11. # 重载所有修改过的配置文件
  12. $ sudo systemctl daemon-reload
  13. # 显示某个 Unit 的所有底层参数
  14. $ systemctl show httpd.service
  15. # 显示某个 Unit 的指定属性的值
  16. $ systemctl show -p CPUShares httpd.service
  17. # 设置某个 Unit 的指定属性
  18. $ sudo systemctl set-property httpd.service CPUShares=500

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

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

4. Unit的配置文件

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

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

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

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

  1. #建立符号链接
  2. $ sudo systemctl enable atd.service
  3. # 等同于
  4. $ sudo ln -s '/usr/lib/systemd/system/atd.service' '/etc/systemd/system/atd.service'
  5. #取消符号链接
  6. $ sudo systemctl disable atd.service

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

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

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

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

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

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

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

5. Target

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

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

  1. # 查看当前系统的所有 Target
  2. $ systemctl list-unit-files --type=target
  3. # 查看一个 Target 包含的所有 Unit
  4. $ systemctl list-dependencies multi-user.target
  5. # 查看启动时的默认 Target
  6. $ systemctl get-default
  7. # 设置启动时的默认 Target
  8. $ sudo systemctl set-default multi-user.target
  9. # 切换 Target 时,默认不关闭前一个 Target 启动的进程,
  10. # systemctl isolate 命令改变这种行为,
  11. # 关闭前一个 Target 里面所有不属于后一个 Target 的进程
  12. $ 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的功能非常强大,其常用的操作如下示例:

  1. # 查看所有日志(默认情况下 ,只保存本次启动的日志)
  2. $ sudo journalctl
  3. # 查看内核日志(不显示应用日志)
  4. $ sudo journalctl -k
  5. # 查看系统本次启动的日志
  6. $ sudo journalctl -b
  7. $ sudo journalctl -b -0
  8. # 查看上一次启动的日志(需更改设置)
  9. $ sudo journalctl -b -1
  10. # 查看指定时间的日志
  11. $ sudo journalctl --since="2020-10-01 18:18:18"
  12. $ sudo journalctl --since "20 min ago"
  13. $ sudo journalctl --since yesterday
  14. $ sudo journalctl --since "2019-01-10" --until "2020-01-11 00:00"
  15. $ sudo journalctl --since 09:00 --until "1 hour ago"
  16. # 显示尾部的最新10行日志
  17. $ sudo journalctl -n
  18. # 显示尾部指定行数的日志
  19. $ sudo journalctl -n 20
  20. # 实时滚动显示最新日志
  21. $ sudo journalctl -f
  22. # 查看指定服务的日志
  23. $ sudo journalctl /usr/lib/systemd/systemd
  24. # 查看指定进程的日志
  25. $ sudo journalctl _PID=1
  26. # 查看某个路径的脚本的日志
  27. $ sudo journalctl /usr/bin/bash
  28. # 查看指定用户的日志
  29. $ sudo journalctl _UID=33 --since today
  30. # 查看某个 Unit 的日志
  31. $ sudo journalctl -u nginx.service
  32. $ sudo journalctl -u nginx.service --since today
  33. # 实时滚动显示某个 Unit 的最新日志
  34. $ sudo journalctl -u nginx.service -f
  35. # 合并显示多个 Unit 的日志
  36. $ journalctl -u nginx.service -u php-fpm.service --since today
  37. # 查看指定优先级(及其以上级别)的日志,共有8级
  38. # 0: emerg
  39. # 1: alert
  40. # 2: crit
  41. # 3: err
  42. # 4: warning
  43. # 5: notice
  44. # 6: info
  45. # 7: debug
  46. $ sudo journalctl -p err -b
  47. # 日志默认分页输出,--no-pager 改为正常的标准输出
  48. $ sudo journalctl --no-pager
  49. # 以 JSON 格式(单行)输出
  50. $ sudo journalctl -b -u nginx.service -o json
  51. # 以 JSON 格式(多行)输出,可读性更好
  52. $ sudo journalctl -b -u nginx.serviceqq
  53. -o json-pretty
  54. # 显示日志占据的硬盘空间
  55. $ sudo journalctl --disk-usage
  56. # 指定日志文件占据的最大空间
  57. $ sudo journalctl --vacuum-size=1G
  58. # 指定日志文件保存多久
  59. $ sudo journalctl --vacuum-time=1years

7.systemd应用操作实战

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

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

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

$ sudo systemctl start httpd

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

$ sudo systemctl status httpd

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

$ sudo systemctl stop httpd.service

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

$ sudo systemctl kill httpd.service

也可以重启服务:

$sudo systemctl restart httpd.service

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/51177
推荐阅读
相关标签
  

闽ICP备14008679号