老男孩教育专注IT教育10余年,只培养IT技术精英

全国免费咨询电话(渠道合作):400-609-2893

28张图,一万字,轻松搞懂Linux系统进程管理!

老男孩IT教育

行业新闻

2023年4月10日 17:06

对于进程管理知识的学习,可以帮助运维人员在不熟悉开发知识时,也可以排查是哪个服务程序影响了系统资源;可以帮助运维人员更好的监控系统的资源情况,并根据一些程序异常作出合理的思路判断。简单来说:当系统资源应用出现异常,运维人员可以从服务进程入手解决问题。

  对于进程管理知识的学习,可以帮助运维人员在不熟悉开发知识时,也可以排查是哪个服务程序影响了系统资源;

  可以帮助运维人员更好的监控系统的资源情况,并根据一些程序异常作出合理的思路判断。

  简单来说:当系统资源应用出现异常,运维人员可以从服务进程入手解决问题。

  系统进程基本概述

  进程概念介绍说明

  一般将开发编写的好代码称为是程序,当开发好的代码运行起来后,就可以称运行起来的代码为系统的进程。

  简单来说:当运行一个程序时,可以将运行的程序称为进程;(系统需要处理任务)

  当程序运行起来成为进程后,系统会为该进程分配内存存储空间,以及分配进程运行的用户身份和权限;

  当程序运行起来成为进程时,系统会有各种指标来表示当前运行的状态

  进程程序之间区别

  程序是数据和执行集合,是一个静态的概念,比如系统中常见的二进制文件,同时程序可以长期存在系统中;

  进程是程序运行的过程,是一个动态的概念,进程是存在生命周期的概念的,会随着程序的终止而销毁;

  进程运行生命周期

  生命周期就是指一个对象的生老病死的过程:

  参考资料:

  https://www.cnblogs.com/wannable/p/6021617.html

  https://blog.51cto.com/u_12027605/1853917

  当父进程接收到任务调度时,会通过fork派生子进程来处理,所以子进程会继承父进程属性:

  1、子进程在处理任务代码时,父进程其实不会进入等待,其运行过程是由linux系统进行调度的;

  2、子进程在处理任务代码后,会执行退出,然后唤醒父进程来回收子进程的资源;

  3、子进程在处理任务代码中,如果出现异常退出,而父进程没有回收子进程资源,会导致子进程运行实体消失

  4、但仍然在内核的进程表中占据一条记录,长期下去对于系统资源是一种浪费;(僵尸进程)

  5、子进程在处理任务代码中,父进程退出了,子进程没有退出,那么子进程就没有父进程来管理了;

  6、有系统的system进程管理;(孤儿进程)

  说明:每个进程都有父进程(PPID),对应的子进程为(PID)

  进行信息查看:

[root@xiaoq ~]# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0       0 12:34   ?        00:00:01 /usr/lib/systemd/systemd --switched-root --system
root          2      0       0 12:34   ?        00:00:00 [kthreadd]
root          4      2       0 12:34   ?        00:00:00 [kworker/0:0H]
root          5      2       0 12:34   ?        00:00:01 [kworker/u256:0]
-- pid为子进程编号,ppid为父进程编号

  系统进程状态监控

  查看当前进程状态

  程序在运行后,需要了解进程的运行状态,查看进程的状态分为两种方式:

  静态进程状态查看:只查看某一时间段的进程运行情况

  动态进程状态查看:实时监控进程信息占用资源的情况

  01 查看当前静态进程状态

  ps命令是“process status”的缩写,ps命令用于显示当前某一时刻系统的进程状态。

  ps命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程:

  •   正在运行和运行的状态
  •   进程是否结束
  •   进程有没有僵死
  •   哪些进程占用了过多的资源等等

  总之大部分信息都是可以通过执行该命令得到的。可以搭配kill指令随时中断、删除不必要的程序。

  语法格式:ps [参数]

  参数信息:系统中出现的进程信息会有两类:用户操作运行的进程/系统运行产生的进程

  说明:以上参数在企业中经常采用组合方式使用:ps -ef(信息更简洁)/ps -aux(包含资源占用情况)

  实践操作:

  实践操作情况-01:查看进程信息、用户信息、pid编号、占用cpu百分比、占用内存宝百分比、状态、执行命令等;

  对比windows系统进程情况:

[root@xiaoq ~]# ps -aux
-- 常见命令参数组合 -aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          2        0.0      0.0        0        0     ?          S      12:34     0:00  [kthreadd]
root          4        0.0      0.0        0        0     ?          S<    12:34     0:00  [kworker/0:0H]
root          5        0.0      0.0        0        0     ?          S      12:34     0:01  [kworker/u256:0]
...省略部分信息...

  输出列信息说明:

  进程状态信息详述:

  说明:一般常见的进程状态有:R+R S D T Ss S< SsI;可以通过man ps获取详细说明;

  进程状态信息详述:

  参考链接资料:https://blog.csdn.net/nilxin/article/details/7437671

  R(running or runnable):运行状态或可运行状态

  只有在该状态的进程才可能在CPU上运行,而同一时刻可能有多个进程处于可执行状态;

  将正在CPU上执行的进程定义为RUNNING状态、而将可执行但是尚未被调度执行的进程定义为READY状态;

  这两种状态在linux下统一为TASK_RUNNING状态。

  进程状态模拟:

[root@xiaoq ~]# ps -aux|grep ps
root       2133  0.0  0.1  51756  1720 pts/0    R+   21:36   0:00 ps -aux

  S(interruptible sleep):可中断的睡眠状态

  处于这个状态的进程因为等待某某事件的发生(比如等待socket连接、等待信号量),而被挂起。

  当某些事件发生时(由外部中断触发、或由其他进程触发),对应的等待队列中的一个或多个进程将被唤醒。

  一般情况下,进程列表中的绝大多数进程都处于task_interruptible状态(除非机器的负载很高)。

  毕竟CPU就这么一两个,进程动辄几十上百个,如果不是绝大多数进程都在睡眠,CPU又怎么响应得过来。

  总结:出现挂起状态的情况:

  某些进程在队列中等待CPU的唤醒;

  某些进程已经被CPU处理完成后;

  进程状态模拟:

[root@xiaoq ~]# ps -aux|grep bash
root       1846  0.0  0.3 116600  3164 pts/1    Ss   16:27    0:00 -bash
root       2074  0.0  0.2 116468  2952 pts/0    Ss+  21:27   0:00 -bash
-- 均可被中断或挂起的父进程

  T(stopped):暂停状态或跟踪状

  当进程正在被跟踪时处于暂停状态;正在被跟踪指的是进程暂停下来,等待跟踪它的进程对它进行操作。

  处于task_traced状态的进程不能响应sigcont信号而被唤醒;只能通过ptrace系统调用执行;

  或调试进程退出,被调试的进程才能恢复task_running状态。

  当某个程序运行后的进程持续不断占用CPU资源时,可以临时先暂停进程运行,程序服务修复后,可以在恢复进程。

  进程状态模拟:

[root@xiaoq ~]# vim /etc/hosts
[1]+  Stopped                 vim /etc/hosts
-- 编写文件过程中,按下ctrl+z快捷键,显示进程被停止

[root@xiaoq ~]# ps -aux|grep vim
root       2070  0.1  0.5  45840  5220 pts/1    T    21:23   0:00 vim /etc/hosts
-- 表示vim执行编写文件信息任务的进程处于被暂停的状态

  D(uninterruptible sleep):不可中断的睡眠状态

  与TASK_INTERRUPTIBLE状态类似,进程处于睡眠状态,但是此刻进程是不可中断的;

  不可中断,指的并不是CPU不响应外部硬件的中断,而是指进程不响应异步信号;

  简单理解就是,kill -9竟然杀不死一个正在睡眠的进程了;

  TASK_UNINTERRUPTIBLE状态存在的意义就在于,内核的某些处理流程是不能被打断的;

  进程状态模拟:

# 在一个会话窗口进行数据压缩打包
[root@xiaoq ~]# tar zcf /opt/data.tar.gz /etc /var /tmp /root

# 在另一个会话窗口进行压缩任务进程信息查看
[root@xiaoq ~]# ps -aux|grep tar|grep -v grep
root       2103 61.3  0.1  20212  1460 pts/1    D+   21:27   0:01 tar zcf /opt/data.tar.gz /etc /var /tmp /root
-- 此时对磁盘进行写入操作的进程是不能被打断的

  Z(zombie process):僵尸进程状态

  进程在退出的过程中,进程占有的所有资源将被回收,但当子进程资源还没有回收时,子进程就死掉了;

  比如在shell中,$?变量就保存了最后一个退出的前台进程的退出码,而这个退出码往往被作为if语句的判断条件

  只要父进程不退出,这个僵尸状态的子进程就一直存在。

  进程状态模拟:编写测试僵尸进程的代码文件,并生成可执行文件

# 模拟实现僵尸进程脚本信息
[root@xiaoq ~]# cat test_zombie.c 
#include <stdio.h>
#include <unistd.h>

int main()
{
   pid_t pid;

   pid = fork();
   if(pid == -1)
     perror("create faild");
   if(pid == 0)//孩子进程
   {
      sleep(3);
      printf("pid process dead\n");
   }
   else if(pid >0)//父进程信息
   {
      int times = 10;
      while(times--)
      {
         printf("ppid process: %d\n",times);
         sleep(1);
      }
      printf("ppid process dead\n");
   }
   return 0;
}

# 生成可执行文件信息
[root@xiaoq ~]# gcc test_zombie.c -o test_zombie

  执行测试代码执行文件:

[root@xiaoq ~]# ./test_zombie 
ppid process: 9      ---
ppid process: 8      --- 第一个阶段:父进程和子进程都存在时,进程正常运行阶段
ppid process: 7      ---
pid process dead   --- 第二个阶段:子进程消失,父进程继续运行
ppid process: 6
ppid process: 5
ppid process: 4
ppid process: 3
ppid process: 2
ppid process: 1
ppid process: 0
ppid process dead --- 第三个阶段:父进程消失,默认自动回收子进程产生的讲师进程
# 以上代码信息执行过程分为三个阶段,利用这个三个阶段可以获取不同的进程状态信息

  执行测试代码进程状态信息变化:

# 第一个阶段:父进程和子进程都存在时
[root@xiaoq ~]# ps -aux|grep test_zombie
root      11126  3.0  0.0   4216   352 pts/7    S<+  19:40   0:00 ./test_zombie
root      11127  0.0  0.0   4212     88 pts/7    S<+  19:40   0:00 ./test_zombie
[root@xiaoq ~]# ps -ef|grep test_zombie
root      11126  10286  0 19:41 pts/7    00:00:00 ./test_zombie
root      11127  11126  0 19:41 pts/7    00:00:00 ./test_zombie

# 第二个阶段:父进程正常,子进程异常,出现僵尸进程阶段
[root@xiaoq ~]# ps -aux|grep test_zombie
root      11126  1.0  0.0   4216   352 pts/7    S<+  19:40   0:00 ./test_zombie
root      11127  0.0  0.0         0       0 pts/7    Z<+  19:40   0:00 [test_zombie] <defunct>
[root@xiaoq ~]# ps -ef|grep test_zombie
root      11126  10286  0 19:41 pts/7    00:00:00 ./test_zombie
root      11127  11126  0 19:41 pts/7    00:00:00 [test_zombie] <defunct>

# 第三个阶段:父进程中止,默认自动回收僵尸进程
[root@xiaoq ~]# ps -aux|grep test_zombie
[root@xiaoq ~]# ps -ef|grep test_zombie

  僵尸进程一旦出现,或造成系统资源浪费,因此需要进行处理:

  通过程序代码可以自动回收僵尸进程(开发处理)

  通过终止服务程序主进程,让僵尸进程自动变为孤儿进程,随之被系统systemd主进程回收(运维处理)

  当服务程序主进程停止后,僵尸进程并没有变为孤儿进程,仍旧存在僵尸进程,可以使用重启操作(服务/系统)

  参考链接资料:https://blog.csdn.net/xiaozuo666/article/details/79833527

  Linux系统中pstree命令的英文全称是“process tree”,即将所有行程以树状图显示;

  树状图将会以 pid (如果有指定) 或是以systemd这个基本行程为根 (root),如果有指定使用者 id;

  则树状图会只显示该使用者所拥有的行程。

# centos7 系统中默认没有pstree命令,需要先进行安装
[root@k8s-node-01 ~]# yum install -y psmisc

  语法格式:pstree [参数]

  参数信息:

  实践操作情况-01:显示启动的进程详细信息

[root@xiaoQ ~]# pstree -a
systemd --switched-root --system --deserialize 22
  ├─NetworkManager --no-daemon
  │   └─2*[{NetworkManager}]
  ├─VGAuthService -s
  ├─abrt-watch-log -F BUG: WARNING: at WARNING: CPU: INFO: possible recursive locking detected ernel BUG at list_del corruption
  ├─abrtd -d -s
  ├─agetty --noclear tty1 linux
  ├─auditd
  │   └─{auditd}
-- 省略部分信息 -- 

  实践操作情况-02:显示运行进程的子父进程之间的关系

[root@xiaoQ ~]# pstree -c
systemd─┬─NetworkManager─┬─{NetworkManager}
        │                └─{NetworkManager}
        ├─VGAuthService
        ├─abrt-watch-log
        ├─abrtd
        ├─agetty
        ├─auditd───{auditd}
        ├─chronyd
        ├─containerd─┬─{containerd}
        │            ├─{containerd}
        │            ├─{containerd}
        │            ├─{containerd}
        │            ├─{containerd}
        │            ├─{containerd}
        │            ├─{containerd}
        │            ├─{containerd}
        │            ├─{containerd}
        │            ├─{containerd}
        │            ├─{containerd}
        │            ├─{containerd}
        │            └─{containerd}
-- 省略部分信息 --

  实践操作情况-03:显示正在处理的进程信息

[root@xiaoQ ~]# pstree -h
├─sshd───sshd───bash───pstree
-- 省略部分信息 --

  02 查看当前动态进程状态

  top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,常用于服务端性能分析;

  top命令中按f可以查看显示的列信息,按对应字母来开启/关闭列,大写字母表示开启,小写字母表示关闭。

  带*号的是默认列。

  语法格式:top [参数]

  参数信息:

  常见指令:( interactive command)

  实践操作情况-01:查看实时的进程情况信息

[root@xiaoq ~]# top
top - 21:58:17 up  9:24,  2 users,  load average: 0.00, 0.01, 0.05
Tasks: 107 total,   1 running, 105 sleeping,   1 stopped,   0 zombie
%Cpu(s):  0.2 us,  0.2 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :   995712 total,    82648 free,   124420 used,   788644 buff/cache
KiB Swap:  1572860 total,  1572860 free,        0 used.   719464 avail Mem 
-- 上半部分,系统资源使用情况汇总说明
   PID USER     PR  NI    VIRT     RES    SHR  S  %CPU %MEM     TIME+ COMMAND
   813  root      20   0  305280   6400   5024 S     0.3     0.6      1:01.48  vmtoolsd
  2174 root      20   0   58308    2072   1480 R     0.3     0.2      0:00.13  top
       1  root      20   0  125888   4324   2568 S     0.0     0.4      0:02.17  systemd
-- 下半部分,具体进程使用资源详细情况

  输出内容信息说明:

  说明:以上信息部分的重要核心知识会在后续内容讲解,大体以了解为主,可以利用man top获取详细说明

  系统进程中断概念

  01 中断概念介绍说明

  中断是系统用来响应硬件设备请求的一种机制,会打断进程的正常调度的执行,然后调用内核的中断处理程序来响应设备的请求。

  从本质上讲中断是一种电信号,当设备有某种事件发生时,就会产生中断,通过总线把电信号发送给中断控制器。如果中断的线是激活的,中断控制器就把电信号发送给处理器的某个特定引脚;处理器于是立即停止自己正在做的事,跳到中断处理程序的入口点,进行中断处理;

  简而言之,就是可以控制CPU中断正在处理的进程任务,完成一些特定的任务进程;

  形象比喻:类似于和别人微信视频聊天,来了电话的情况;

  02 中断概念作用说明

  用生活的案例进行说明,比如订了一份外卖,但是不确定外卖什么时候送到,也没有别的方法了解外卖的进度;

  所以你只能苦苦等待,时不时到门口去看看外卖送到没,而不能干其他事情。

  但是,如果在订外卖的时候,和配送员约定好,让他送到后给你打个电话,那你就不用苦苦等待了,可去忙别的;

  一旦电话响起,接完电话去取外卖就可以了。这里的“打电话”,其实就是一个中断;

  没接到电话的时候,可以做其他的事情,只有接到了电话(也就是发生了中断),才要进行另一个动作:取外卖;

  通过此例子就可以发现,中断其实是一种异步的事件处理机制,可以提高系统的并发处理能力。

  03 中断存在问题说明

  由于中断处理程序会打断其他进程的运行,为了减少对正常进程运行调度的影响,中断处理需要尽可能快运行;

  如果中断本身要做的事情不多,那么处理中断服务程序就只是花费较少的时间;

  如果中断本身要做的事情很多,那么处理中断服务程序就将会花费很长的时间;

  需要注意:中断处理程序在响应中断时,还会关闭接收处理其他的中断,会导致其他中断不能响应,造成中断丢失

  比如在订外卖时,订了2份外卖:

  两个不同的配送员配送外卖时,都约订了外卖送到时进行电话确认;

  第一份外卖送到时,配送员给你打了个很长的电话,比如确认地址或外卖发票的问题;

  第二份外卖送到时,配送员给你打电话将无法拨通,可能尝试几次后配送员就走了;(类似丢失了一次中断)

  总结:多个中断出现时,尽量让中断进程消耗的时间越短越好,保证其他中断可以正常处理,否则会出现中断丢失

  04 中断概念类别说明

  为了解决中断处理程序执行时间过长或中断丢失的问题,Linux将中断处理过程分成了两个阶段:

  上半部阶段:用来快速处理中断,在中断禁止模式下运行,主要处理和硬件紧密相关的工作;

  下半部阶段:用来延迟处理上半部未完成的工作,通常以内核线程的方式运行;

  硬中断概念作用(上半部)

  由与系统相连的外设(比如网卡、硬盘)自动产生的,主要是用来通知操作系统系统外设状态的变化。

  比如当网卡收到数据包的时候,就会发出一个中断。我们通常所说的中断指的是硬中断(hardirq)。

  软中断概念作用(下半部)

  为了满足实时系统的要求,中断处理应该是越快越好。

  linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间就可以完成的工作;

  而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断(softirq)来完成。

  总结:CPU正在处理进程任务--网卡接收数据(硬中断--数据临时保存到内存中)-- 到内存中处理数据(软中断)

  --- CPU恢复处理之前进程任务

  举例详细说明-01:生活外卖派送过程

  上半部阶段:是接电话后,告诉配送员已经知晓快递送到的事情,其他事情回头再说,然后挂断电话;

  下半部阶段:是具体外卖的一些情况说明,比如商量是否开发票,具体怎么开等等;

  这样设计后,第一个配送员不会占用你太多时间,第二个配送员过来时,照样能正常打通你的电话。

  举例详细说明-02:网卡收取数据过程

  网卡接收到数据包后,会通过硬件中断的方式,通知内核有新的数据到了,内核会中断处理程序响应它;

  上半部阶段:需要进行快速处理,就要把网卡的数据读取到内存中,然后更新硬件寄存器状态(表示数据已读好),最后再发送一个软中断信号,通知下半部做进一步的处理。

  下半部阶段:被软中断信号唤醒后,需要从内存中找到网络数据,再按照网络协议栈,对数据进行逐层解析处理;

  两个阶段简单理解:

  上半部直接处理硬件请求,也就是常说的硬中断,特点是快速执行;

  下半部则是有内核触发的,也就是常说的软中断,特点是延迟执行;

  Linux中的软中断包含:网络收发、定时任务、数据调度等各种类型,可通过查看/proc/softirqs观察软中断情况

  05 中断概念类别区别

  •   软中断是执行中断指令产生的,而硬中断是由外设引发的;
  •   硬中断的中断信号是由中断控制器提供的,软中断的中断信号由指令直接控制,无需使用中断控制器;
  •   硬中断是可屏蔽的,软中断不可屏蔽;
  •   硬中断处理程序要确保它能快速地完成任务,这样程序执行时才不会等待较长时间,称为上半部;
  •   软中断处理硬中断未完成的工作,是一种推后执行的机制,属于下半部;

  系统进程状态管理

  在进行状态管理知识学习前,需要掌握系统进程启动的方式和系统进程停止的方式。

  进程启动方式:操作命令+参数信息+程序代码/配置文件,即表示实现将程序运行起来变为进程;

  进程停止方式:可以利用系统专门的进程停止命令,向运行的进程发出停止信号,随之停止进程

  进程停止命令详述

  01 系统进程停止命令-kill

  kill命令正如这个单词的意思一样,就是杀死,在linux系统会使用此命令来删除执行中的程序或工作。

  kill命令可将指定的信号发送给相应的进程或工作。 kill命令默认使用信号为15,用于结束进程或工作。

  如果进程或工作忽略此信号,则可以使用信号9,强制杀死进程或作业。

  语法格式:kill [参数] [进程号]

  参数信息:

  实践操作:

  实践操作情况-01:列出当前系统所支持的所有进程控制信号

[root@xiaoq ~]# kill -l

  显示的信号信息如下:

  虽然,Linux系统支持的信号很多,但是在日常企业应用环节中比较常用的有以下3种信号:

  常见信号图形说明:

  实践操作情况-02:利用各种信号测试停止进程的情况

# 进程管理模拟环境准备
[root@xiaoq ~]# yum install -y httpd
[root@xiaoq ~]# systemctl start httpd
[root@xiaoq ~]# systemctl is-active httpd
active
-- 确认测试服务程序已经启动成功

# 查看测试服务进程信息
[root@xiaoq ~]# ps -ef|grep httpd
root          2590         1  0 00:51 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2591   2590  0 00:51 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2592   2590  0 00:51 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2593   2590  0 00:51 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2594   2590  0 00:51 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2595   2590  0 00:51 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND

# 使用命令停止指定进程
# 发送进程控制信号-SIGHUP
[root@xiaoq ~]# kill -1 2590
[root@xiaoq ~]# ps -ef|grep httpd
root          2590         1  0 00:51 ?        00:00:00 /usr/sbin/httpd -DFOkilREGROUND
apache     2599   2590  0 00:55 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2600   2590  0 00:55 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2601   2590  0 00:55 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2602   2590  0 00:55 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2603   2590  0 00:55 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
-- 主进程收到SIGHUP信号,会重载配置文件信息,主进程编号不变,子进程信息重新启动

# 发送进程控制信号-SIGTERM
[root@xiaoq ~]# kill 2590
[root@xiaoq ~]# ps -ef|grep httpd
-- 主进程收到SIGTERM信号,会确认进程是否有未完成的工作,如果闲置状态,会立即终止进程

# 发送进程控制信号-SIGKILL
[root@xiaoq ~]# ps -ef|grep httpd
root          2636         1  1 01:05 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2637   2636  0 01:05 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2638   2636  0 01:05 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2639   2636  0 01:05 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2640   2636  0 01:05 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2641   2636  0 01:05 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
[root@xiaoq ~]# kill -9 2636
-- 主进程收到SIGKILL信号,无论进程是否有未完成的工作,都立即终止进程
[root@xiaoq ~]# ps -ef|grep httpd
apache     2637         1  0 01:05 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2638         1  0 01:05 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2639         1  0 01:05 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2640         1  0 01:05 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2641         1  0 01:05 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
-- 主进程会被立刻杀死,但子进程依然存在,产生出大量孤儿进程,已不能提供任何服务
[root@xiaoq ~]# systemctl start httpd
[root@xiaoq ~]# ps -ef|grep httpd
root          2656         1  2 01:09 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2657   2656  0 01:09 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2658   2656  0 01:09 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2659   2656  0 01:09 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2660   2656  0 01:09 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2661   2656  0 01:09 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
-- 在此启动服务程序后,原有的孤儿进程会被销毁,重新生成服务的主进程和相应子进程

  02 系统进程停止命令-pkill

  pkill命令可以按照进程名杀死进程;pkill和killall应用方法差不多,也是直接杀死运行中的程序。

  如果想杀掉单个进程,请用kill来杀掉。

  语法格式:pkill [参数] [进程名]

  参数信息:

  实践操作情况-01:根据进程名称杀死进程

# 查看测试服务进程信息
[root@xiaoq ~]# systemctl start httpd
[root@xiaoq ~]# ps -ef|grep httpd
root          2656         1  0 01:09 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2657   2656  0 01:09 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2658   2656  0 01:09 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2659   2656  0 01:09 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2660   2656  0 01:09 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     2661   2656  0 01:09 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND

# 使用命令停止指定进程
[root@xiaoq ~]# pkill httpd
[root@xiaoq ~]# ps -ef|grep httpd
-- 将指定服务进程进行终止

  实践操作情况-02:将指定用户的远程连接断开(踢掉滚蛋)

# 获取当前系统登录用户信息
[root@xiaoq ~]# w
 01:40:24 up 13:50,  2 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM       LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    10.0.0.1         23:34    0.00s  1.23s  0.01s  w
root     pts/1    10.0.0.1         01:40    3.00s  0.05s  0.05s -bash
-- 此时有两个用户在登录系统
[root@xiaoq ~]# ps -ef|grep pts
root       2408   1265  0  Jan26 ?           00:00:02  sshd: root@pts/0,pts/1
root       2410   2408  0  Jan26 pts/0    00:00:01 -bash
root       2780   2408  0  01:40  pts/1    00:00:00 -bash
-- 进程中也查看到有两个用户终端建立的远程连接

# 中断指定相应终端建立的连接
[root@xiaoq ~]# pkill -9 -t pts/1
[root@xiaoq ~]# w
 01:43:51 up 13:53,  1 user,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    10.0.0.1              23:34    7.00s  1.27s   0.01s w
[root@xiaoq ~]# ps -ef|grep pts
root       2408   1265  0 Jan26 ?           00:00:02 sshd: root@pts/0
root       2410   2408  0 Jan26 pts/0    00:00:01 -bash
-- 中断后,显示只有一个用户在远程控制管理系统

 

本文经授权发布,不代表老男孩教育立场。如若转载请联系原作者。