RHCSA 系列:RHEL 7 中的进程管理:启动、关闭以及其间的所有内容 – 第 5 部分
我们将在本文开始时对从按下电源按钮打开RHEL 7服务器的那一刻起直到出现登录界面时所发生的情况进行总体和简要的修订命令行界面中的屏幕。
请注意:
1.相同的基本原则(可能稍加修改)也适用于其他 Linux 发行版,并且
2.以下描述并不是对启动过程的详尽解释,而只是基本原理。
Linux启动过程
1.POST(开机自检)初始化并执行硬件检查。
2.当POST完成时,系统控制权被传递到第一阶段引导加载程序,该加载程序存储在其中一个硬盘的引导扇区上(对于较旧的硬盘)使用 BIOS 和 MBR 的系统)或专用 (U)EFI 分区。
3. 第一阶段引导加载程序随后加载第二阶段引导加载程序,最常见的是 GRUB (GRand Unified Boot Loader),它位于/boot,依次加载内核和基于 RAM 的初始文件系统(也称为 initramfs,其中包含执行最终所需操作的程序和二进制文件)挂载实际的根文件系统)。
4. 我们会看到一个启动屏幕,允许我们选择要启动的操作系统和内核:
5.内核设置连接到系统的硬件,一旦安装了根文件系统,就会启动PID 1的进程,该进程将初始化其他进程并呈现我们有登录提示。
注意:如果我们希望稍后这样做,我们可以使用 dmesg 命令检查此过程的细节,并使用我们提供的工具过滤其输出。在本系列之前的文章中已经解释过。
在上面的示例中,我们使用众所周知的 ps 命令来显示当前进程的列表,其父进程(或者换句话说,启动它们的进程)是 systemd >(大多数现代 Linux 发行版已切换到的系统和服务管理器)在系统启动期间:
ps -o ppid,pid,uname,comm --ppid=1
请记住,-o 标志(–format 的缩写)允许您以自定义格式呈现 ps 的输出,以满足您的需求: man ps 中的STANDARD FORMAT SPECIFIERS 部分中指定的关键字。
另一种需要定义 ps 输出而不是使用默认值的情况是,当您需要查找导致大量 CPU 和/或内存负载的进程并相应地对它们进行排序时:
ps aux --sort=+pcpu # Sort by %CPU (ascending)
ps aux --sort=-pcpu # Sort by %CPU (descending)
ps aux --sort=+pmem # Sort by %MEM (ascending)
ps aux --sort=-pmem # Sort by %MEM (descending)
ps aux --sort=+pcpu,-pmem # Combine sort by %CPU (ascending) and %MEM (descending)
SystemD 简介
在 Linux 世界中,很少有决策比主要 Linux 发行版采用 systemd 引起的争议更多。 Systemd 的拥护者认为其主要优点如下:
另请阅读:“init”和“systemd”背后的故事
1. Systemd 允许在系统启动期间并行完成更多处理(与较旧的 SysVinit 相反,后者总是会变慢,因为它会逐个启动进程,检查如果一个依赖于另一个,然后等待守护进程启动,以便可以启动更多服务),以及
2. 它在运行的系统中充当动态资源管理。因此,服务会在需要时启动(以避免在未使用时消耗系统资源),而不是在引导期间无正当理由启动服务。
3. 向后兼容 SysVinit 脚本。
Systemd 由systemctl 实用程序控制。如果您有 SysVinit 背景,您很可能会熟悉:
- service 工具,在那些较旧的系统中,用于管理 SysVinit 脚本,以及
- chkconfig 实用程序,用于更新和查询系统服务的运行级别信息。
- 关闭,您必须多次使用它来重新启动或停止正在运行的系统。
下表显示了这些旧版工具与 systemctl 的使用之间的相似之处:
Legacy tool | Systemctl equivalent | Description |
service name start | systemctl start name | Start name (where name is a service) |
service name stop | systemctl stop name | Stop name |
service name condrestart | systemctl try-restart name | Restarts name (if it’s already running) |
service name restart | systemctl restart name | Restarts name |
service name reload | systemctl reload name | Reloads the configuration for name |
service name status | systemctl status name | Displays the current status of name |
service –status-all | systemctl | Displays the status of all current services |
chkconfig name on | systemctl enable name | Enable name to run on startup as specified in the unit file (the file to which the symlink points). The process of enabling or disabling a service to start automatically on boot consists in adding or removing symbolic links inside the /etc/systemd/system directory. |
chkconfig name off | systemctl disable name | Disables name to run on startup as specified in the unit file (the file to which the symlink points) |
chkconfig –list name | systemctl is-enabled name | Verify whether name (a specific service) is currently enabled |
chkconfig –list | systemctl –type=service | Displays all services and tells whether they are enabled or disabled |
shutdown -h now | systemctl poweroff | Power-off the machine (halt) |
shutdown -r now | systemctl reboot | Reboot the system |
Systemd 还引入了单元(可以是服务、挂载点、设备或网络套接字)和目标(这就是 systemd 如何同时启动多个相关进程)的概念时间,并且可以被认为(尽管不等于)相当于基于 SysVinit 系统中的运行级别。
加起来
与流程管理相关的其他任务包括但可能不限于以下能力:
1. 调整进程对系统资源的使用的执行优先级:
这是通过 renice 实用程序来完成的,该实用程序会更改一个或多个正在运行的进程的调度优先级。简单来说,调度优先级是一项功能,允许内核(存在于版本 => 2.6 中)根据分配的执行优先级(也称为良好性,范围为 给定进程的-20到19)。
renice的基本语法如下:
renice [-n] priority [-gpu] identifier
在上面的通用命令中,第一个参数是要使用的优先级值,而另一个参数可以解释为进程 ID(这是默认设置)、进程组 ID、用户 ID 或用户名。普通用户(root 除外)只能修改自己拥有的进程的调度优先级,并且只能提高良好级别(这意味着占用更少的系统资源)。
2. 根据需要杀死(或中断正常执行)进程:
更准确地说,终止进程有权通过kill或pkill向其发送信号以优雅地完成其执行(SIGTERM=15)或立即完成(SIGKILL=9)命令。
这两个工具之间的区别在于,前者用于完全终止特定进程或进程组,而后者允许您根据名称和其他属性执行相同的操作。
此外,pkill 与 pgrep 捆绑在一起,它会向您显示使用 pkill 时将受到影响的 PID。例如,在运行之前:
pkill -u gacanepa
一目了然地查看 gacanepa 拥有的 PID 可能会很有用:
pgrep -l -u gacanepa
默认情况下,kill 和 pkill 都会向进程发送 SIGTERM 信号。正如我们上面提到的,这个信号可以被忽略(当进程完成执行或永久执行时),因此当您确实需要以正当理由停止正在运行的进程时,您将需要指定 SIGKILL 命令行上的信号:
kill -9 identifier # Kill a process or a process group
kill -s SIGNAL identifier # Idem
pkill -s SIGNAL identifier # Kill a process by name or other attributes
结论
在本文中,我们解释了 RHEL 7 系统中引导过程的基础知识,并分析了一些可帮助您使用常用实用程序管理进程的工具和特定于 systemd 的命令。
请注意,此列表并不旨在涵盖本主题的所有附加功能,因此请随意使用下面的评论表将您自己喜欢的工具和命令添加到本文中。也欢迎提出问题和其他意见。