【Linux系统】关于守护进程

简介: 在某家公司工作期间,会使用常驻进程来作为需要保活运行的机制,用以维护消费者进程。但当时对于守护进程的理解还是不够深入,所以现在再把这块做个整理,并结合当时遇到的一个问题实例进行分析。注:下面内容都针对Linux操作系统。(Mac上的launchd与systemd作用相同,而且据说systemd的很多概念来自launched)。

一 背景

   在某家公司工作期间,会使用常驻进程来作为需要保活运行的机制,用以维护消费者进程。但当时对于守护进程的理解还是不够深入,所以现在再把这块做个整理,并结合当时遇到的一个问题实例进行分析。注:下面内容都针对Linux操作系统。(Mac上的launchd与systemd作用相同,而且据说systemd的很多概念来自launched)。

二 守护进程

2.1 init.d

历史上,Linux 的启动一直采用init进程来启动服务。例如:

service apache2 start
sudo /etc/init.d/apache2 start

/etc/init.d 是 /etc/rc.d/init.d 的软链接(soft link)。可以通过 ll 命令查看。

ls -ld /etc/init.d
lrwxrwxrwx. 1 root root 11 Aug 30 2015 /etc/init.d -> rc.d/init.d

/etc/init.d是用来放服务脚本的,当Linux启动时,会寻找这些目录中的服务脚本,并根据脚本的run level确定不同的启动级别。例如,某台测试机上的/etc/init.d目录下的内容如下:

2.2 systemd

2.2.1 init缺陷

init方法启动服务有两个缺陷:

1、启动时间长。init进程是串行执行,在一个进程启动完毕后,才能启动下一个进程

2、启动脚本复杂。init进程只负责执行启动脚本,脚本自身需要处理各种异常情况,这使得脚本内容过长且不易控制。

因此,就有了systemd的诞生。

2.2.2 systemd概述

   关于systemd可以查看freedesktop的这篇文献:systemd System and Service Manager

简单描述如下:systemd是Linux系统的一套基本构建块。它提供了一个系统和服务管理器,它作为PID 1运行并启动系统的其余部分。

system的命令位置和版本查看:

[xxx@wx-crm1 ~]$ systemctl --version
systemd 219
+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN
[xxx@wx-crm1 ~]$ which systemctl
/usr/bin/systemctl

Systemd 的优点是功能强大,使用方便,缺点是体系庞大,非常复杂。事实上,现在还有很多人反对使用 Systemd,理由就是它过于复杂,与操作系统的其他部分强耦合,违反"keep simple, keep stupid"的Unix 哲学

相关争议内容链接:

Solidot | systemd作者抨击开源和Linux社区

Solidot | 抗议者创建Systemd分支Uselessd

2.2.3 systemd架构

2.2.4 systemd相关命令

systemctl是systemd的主命令,提供的主要功能和使用方式如下:

# 重启系统
$ sudo systemctl reboot
# 关闭系统,切断电源
$ sudo systemctl poweroff
# CPU停止工作
$ sudo systemctl halt
# 暂停系统
$ sudo systemctl suspend
# 让系统进入冬眠状态
$ sudo systemctl hibernate

除此之外,还有systemd-analyze,用语查看启动耗时;

# 查看启动耗时
$ systemd-analyze
# 查看每个服务的启动耗时
$ systemd-analyze blame
# 显示瀑布状的启动过程流
$ systemd-analyze critical-chain
# 显示指定服务的启动流
$ systemd-analyze critical-chain atd.service

hostnamectl命令用于查看当前主机的信息

localectl命令用于控制系统区域设置和键盘布局设置

timedatectl命令用于查看当前时区设置。

loginctl命令用于查看当前登录的用户,等等。

2.2.5 相关概念

1、单元

系统初始化需要做的事情较多,例如启动sshd,需要做很多配置工作。这个过程中的每一步将会被抽象为一个配置单元 unit。通常可以认为一个服务是一个配置单元,一个挂载点是一个配置单元,一个交换分区的配置是一个配置单元等。

通过这样的抽象,可以简化文件开发,例如一个mysql服务对应一个mysql.server文件,这种配置会非常简单,我们也不再需要编写和维护复杂的系统5脚本了。

2、依赖关系

systemd已经将大量的启动工作解除了依赖,使得他们可以并发启动,但还有有些任务之间存在依赖关系。systemd用配置单元定义文件中的关键字来描述配置单元之间的依赖关系。比如unit A依赖unit B,可以再unit B的定义中用"require A"来表示,这样systemd会保证优先启动A,然后再启动B。

3、事务

这里的事务,与数据库中事务的概念有所不同,是为了保证多个依赖的配置单元之间没有环形引用。比如有A,B,C三个单元,存在环形依赖关系:

如果存在这一的依赖,那么将无法启动任意一个服务。systemd会尝试通过依赖关系的强(required)和弱(want)的分别,通过去掉wants关键字指定的依赖来尝试打破循环,无法修复的话将会报错。

4、target和运行级别

systemd用target取代了运行级别的概念。systemd下目标和常见runlevelt的对应关系如下:

2.2.6 systemd的并发启动原理

主要有三种方式:解决 socket 依赖;解决D-Bus依赖,即desktop-bus依赖,是一种进程间通信机制;解决文件系统依赖。详细解释请查阅参考文献1.

三 小结

   本章描述systemd的起源及主要概念,并列举了一些参考文献。在下一篇文章,将介绍我们之前项目中的一种使用方式,和遇到的问题及解决过程。

参考文章

浅析 Linux 初始化 init 系统,第 3 部分 systemd

阮一峰,Systemd 入门教程:命令篇

Linux守护进程之systemd

相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
相关文章
|
4天前
|
Linux 应用服务中间件 Shell
linux系统服务二!
本文详细介绍了Linux系统的启动流程,包括CentOS 7的具体启动步骤,从BIOS自检到加载内核、启动systemd程序等。同时,文章还对比了CentOS 6和CentOS 7的启动流程,分析了启动过程中的耗时情况。接着,文章讲解了Linux的运行级别及其管理命令,systemd的基本概念、优势及常用命令,并提供了自定义systemd启动文件的示例。最后,文章介绍了单用户模式和救援模式的使用方法,包括如何找回忘记的密码和修复启动故障。
21 5
linux系统服务二!
|
4天前
|
缓存 监控 Linux
linux进程管理万字详解!!!
本文档介绍了Linux系统中进程管理、系统负载监控、内存监控和磁盘监控的基本概念和常用命令。主要内容包括: 1. **进程管理**: - **进程介绍**:程序与进程的关系、进程的生命周期、查看进程号和父进程号的方法。 - **进程监控命令**:`ps`、`pstree`、`pidof`、`top`、`htop`、`lsof`等命令的使用方法和案例。 - **进程管理命令**:控制信号、`kill`、`pkill`、`killall`、前台和后台运行、`screen`、`nohup`等命令的使用方法和案例。
26 4
linux进程管理万字详解!!!
|
4天前
|
Linux 应用服务中间件 Shell
linux系统服务!!!
本文详细介绍了Linux系统(以CentOS7为例)的启动流程,包括BIOS自检、读取MBR信息、加载Grub菜单、加载内核及驱动程序、启动systemd程序加载必要文件等五个主要步骤。同时,文章还对比了CentOS6和CentOS7的启动流程图,并分析了启动流程的耗时。此外,文中还讲解了Linux的运行级别、systemd的基本概念及其优势,以及如何使用systemd管理服务。最后,文章提供了单用户模式和救援模式的实战案例,帮助读者理解如何在系统启动出现问题时进行修复。
21 3
linux系统服务!!!
|
12天前
|
Web App开发 搜索推荐 Unix
Linux系统之MobaXterm远程连接centos的GNOME桌面环境
【10月更文挑战第21天】Linux系统之MobaXterm远程连接centos的GNOME桌面环境
112 4
Linux系统之MobaXterm远程连接centos的GNOME桌面环境
|
4天前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
24 4
|
4天前
|
网络协议 Linux
linux系统重要文件目录
本文介绍了Linux系统中的重要目录及其历史背景,包括根目录、/usr、/etc、/var/log和/proc等目录的结构和功能。其中,/etc目录下包含了许多关键配置文件,如网卡配置、DNS解析、主机名设置等。文章还详细解释了各目录和文件的作用,帮助读者更好地理解和管理Linux系统。
18 2
|
5天前
|
缓存 负载均衡 算法
Linux内核中的进程调度算法解析####
本文深入探讨了Linux操作系统核心组件之一——进程调度器,着重分析了其采用的CFS(完全公平调度器)算法。不同于传统摘要对研究背景、方法、结果和结论的概述,本文摘要将直接揭示CFS算法的核心优势及其在现代多核处理器环境下如何实现高效、公平的资源分配,同时简要提及该算法如何优化系统响应时间和吞吐量,为读者快速构建对Linux进程调度机制的认知框架。 ####
|
6天前
|
Ubuntu Linux Shell
Linux 系统中的代码类型或脚本类型内容
在 Linux 系统中,代码类型多样,包括 Shell 脚本、配置文件、网络配置、命令行工具和 Cron 定时任务。这些代码类型广泛应用于系统管理、自动化操作、网络配置和定期任务,掌握它们能显著提高系统管理和开发的效率。
|
6天前
|
消息中间件 存储 Linux
|
9天前
|
关系型数据库 MySQL Linux
Linux系统如何设置自启动服务在MySQL数据库启动后执行?
【10月更文挑战第25天】Linux系统如何设置自启动服务在MySQL数据库启动后执行?
50 3

热门文章

最新文章