• 【Linux】关于进程



    程序在系统中运行,都是以进程的形式存在的!
    下面来介绍如何查看系统中的进程


    一、查看进程

    程序运行在进程系统上,称为 - 进程
    Linux系统中的ps命令支持三个不同类型的命令行参数。

    • Unix:单破折号
    • BSD:无破折号
    • GNU:双破折号

    下面只介绍 Unix 的,也就是说 单破折号的。

    -A  #显示所有进程
    -a	#显示除控制进程和无终端的进程之外的所有进程
    -e	#显示所有进程
    -f	#显示完整格式输出
    -l	#显示长列表
    -H	#层级显示进程(树状)
    -L	#显示进程中的线程
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    上述只列出了我认为比较有用的,还有很多其他的,可以根据需要自己去查找补充。

    举例子:ps -ef

    kylin@kylin-thinkpadx390:~$ ps -ef
    UID          PID    PPID  C STIME TTY          TIME CMD
    root           1       0  0 09:04 ?        00:00:01 /sbin/init splash
    root           2       0  0 09:04 ?        00:00:00 [kthreadd]
    root           3       2  0 09:04 ?        00:00:00 [rcu_gp]
    root           4       2  0 09:04 ?        00:00:00 [rcu_par_gp]
    root           6       2  0 09:04 ?        00:00:00 [kworker/0:0H-events_highpri
    root           9       2  0 09:04 ?        00:00:00 [mm_percpu_wq]
    root          10       2  0 09:04 ?        00:00:00 [ksoftirqd/0]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    其中:

    UID	#启动该进程的用户
    PID	#进程的进程号
    PPID	#父进程的进程号
    C	#进程生命周期中的cpu利用率
    STIME	#进程开始的系统时间
    TTY	#进程启动时的终端设备
    TIME	#运行进程需要的累计CPU时间
    CMD	#启动的程序名称
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    如果想显示的更全一些,可以使用:ps -l

    F S   UID     PID    PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
    0 S  1000   18715   18703  0  80   0 -  3435 do_wai pts/0    00:00:00 bash
    4 R  1000   26892   18715  0  80   0 -  3622 -      pts/0    00:00:00 ps
    
    • 1
    • 2
    • 3

    其中:

    F	#内核分配给进程的系统标记
    S	#进程的状态(0-正在运行,S-正在休眠,R-可运行,正在等待运行,Z-僵化,进程已结束但父进程已不存在,T-停止)
    PRI	#优先级,数字越大,优先级越低
    NI	#谦让度nice
    ADDR	#进程的内存地址
    SZ	#假如进程被换出,所需交换空间的大致大小
    WCHAN	#进程休眠的内核函数的地址
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    ps -efH

    kylin@kylin-thinkpadx390:~$ ps -efH
    UID          PID    PPID  C STIME TTY          TIME CMD
    root         833       1  0 09:04 ?        00:00:00   /bin/bash /usr/bin/execsta
    root         884     833  0 09:04 ?        00:00:00     /usr/bin/miracle-wifid -
    root        1082     884  0 09:04 ?        00:00:00       /usr/bin/miracle-sinkc
    
    • 1
    • 2
    • 3
    • 4
    • 5

    ps:我使用的是麒麟系统,国产Linux,里面的命令和Linux基本是一致的。上述,都是从麒麟系统中截取出来的。


    ps命令只能显示某个特定时间点的信息,如果想要实时监测,需要用top命令。
    下面来介绍一下 实时监测进程指令 top


    二、实时监测进程

    top
    
    • 1

    在这里插入图片描述

    • 输出的第一部分:第一行显示了 当前时间、系统的运行时间、登入的用户数以及系统的平均负载

    平均负载有3个值:最近1分钟,最近5分钟和最近15分钟的平均负载。

    • 第二行显示了概要的进程信息,top命令的输出中进程叫做任务;多少个进程处在运行、休眠、停止或是僵化(僵化状态是指进程完成了,但父进程没有响应)
    • 第三行显示了CPU信息,

    最后一部分显示了当前运行中的进程的下详细列表,有些类似ps命令。

    PID	#进程号
    USER	#进程属主的名字
    PR	#进程的优先级
    NI	#进程的谦让度
    VIRT	#进程占用的虚拟内存总量
    RES	#进程占用的物理内存总量
    SHR	#进程和其他进程共享的内存总量
    S	#进程的状态(D-可中断的休眠状态,R-运行状态,S-休眠状态,T-跟踪状态或停止状态,Z-代表僵化状态)
    %CPU	#进程使用的CPU时间比例
    %MEM	#进程使用的内存占可用内存的比例
    TIME+	#自进程启动到目前为止的CPU时间总量
    COMMAND		#进程的命令行名称,也就是启动的程序名
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    其中,top命令在启动时会按照 %CPU 来排序,也可以重新排序。


    上面两小节记述了进程的查看方式,那么如何结束一个进程呢?
    进程的状态有多种,针对不同的进程状态,需要不同的处理方式。
    接下来,简单记述一下进程状态


    三、进程状态

    一般来说,进程有三个状态:

    • 就绪
    • 运行
    • 阻塞

    其中,根据状态之间可相互转换,可以得出有以下六种状态转换,可以看成三组:

    1. 就绪 TO 运行:正常程序
    2. 运行 TO 就绪:两种可能,a.进程占用时间长,系统分配给该进程的时间是有限的 b.优先级问题
    3. 就绪 TO 阻塞:不存在此种可能,没有运行,谈何阻塞
    4. 阻塞 TO 就绪:进程等待的事件发生,就进入就绪队列
    5. 运行 TO 阻塞
    6. 阻塞 TO 运行:不存在此种可能,即时给阻塞进程分配CPU,也不会执行,操作系统在进行调度时不会从阻塞队列进行挑选,会从就绪队列进行挑选


    还可能见到的一些其他状态

    • 挂起:进程从内存调度到外存中的一种状态,可理解为暂时被淘汰出内存的进程。
    • 可运行
    • 浅睡眠:进程正在睡眠(被阻塞),可以通过其他进程信号或时钟中断唤醒
    • 深睡眠:和浅睡眠类似,但不可被其他进程或时钟唤醒
    • 暂停:进程暂停执行,接受某种处理
    • 僵死:进程已经结束但未释放进程控制块

    第三节记述了进程的各种可能状态,
    下面来介绍一下,如何结束进程?


    四、结束进程

    Linux进程信号:

    信号名称描述
    1HUP挂起
    2INT中断
    3QUIT结束运行
    9KILL无条件终止
    11SEGV段错误
    15TERM尽可能终止
    17STOP无条件停止运行,但不终止
    18TSTP停止或暂停,但继续在后台运行
    19CONT在STOP或TSTP之后恢复执行

    解释:

    • 进程 终止和停止的区别:停止可以理解为暂停,终止可理解为彻底结束

    kill

    注意:

    1. 只能使用进程号,而不能使用命令名
    2. 要发送进程信号,必须是进程的属主或是root用户
    kill PID #其中PID为进程号
    
    • 1

    killall

    • 支持通过 进程名 来结束进程
    • 也支持通配符
    killall http*
    
    • 1
  • 相关阅读:
    博客记录生活
    OAuth2.0
    短剧小程序开发,重塑视频观看体验的科技革命
    CleanShot X for Mac v4.7 屏幕截图录像工具(保姆级教程,小白轻松上手,简单易学)
    物联网的未来:连接的智能世界
    ESP32+阿里云+vscode_Pio
    多数据源+数据库分库分表
    【前后端交互与HTTP协议】(HTTP协议、本地存储、Ajax&Fetch 与跨域请求)
    nginx 搭建高可用集群
    HTTP 网关 GZIP 页面零开销注入 JS
  • 原文地址:https://blog.csdn.net/Sanayeah/article/details/126362052