写点什么

系统管理 -Linux 系统进程管理

  • 2022 年 8 月 06 日
  • 本文字数:3577 字

    阅读完需:约 12 分钟

系统管理-Linux系统进程管理
  • 什么是进程

  • 进程生命周期

  • 监控和管理进程

  • 静态监控进程

  • 动态监控进程

  • 信号管理进程

  • 后台进程管理



什么是进程

进程是已启动的可执行程序的运行实例,进程有以下组成部分:
  1. 分配内存, 已分配内存的地址空间

  2. 安全属性, 进程的运行身份和权限

  3. 进程代码, 运行一个或多个的线程

  4. 进程状态, 进程运行后的多种状态


静态程序, 二进制文件, 静态/bin/ls, /usr/sbin/sshd


动态进程, 程序运行的过程, 有生命周期及运行状态

进程的运行环境,包括以下几个部分:
  1. 局部和全局变量

  2. 当前的调度上下文

  3. 分配给进程使用的系统资源,例如文件描述符、网络端口等

  4. 给进程分配对应的 pid,ppid



进程生命周期

程序运行时进程的状态关系:
  1. 父进程复制自己的地址空间创建新的子进程, 子进程可以继承父进程(ppid)的环境变量

  2. 每个进程都有自己的唯一 ID(PID)

  3. 进程是由 systemd 这个父进程派生出来的子进程

  4. 子进程在运行自己的程序代码的时候, 父进程往往会进入到睡眠状态

  5. 子进程完成程序代码发出退出信号请求

  6. 子进程已经关闭或丢弃了其资源环境, 剩余的部分称之为僵停(僵尸 Zombie)

  7. 父进程在子进程退出时收到信号会被唤醒, 清理剩余的结构,然后继续执行其自己的程序代码



监控和管理进程

  1. 在多任务处理操作系统中,每个 CPU(或核心)在一个时间点上只能处理一个进程

  2. 在进程运行时,它对 CPU 时间和资源分配的要求会不断变化,从而为进程分配一个状态,它随着环境要求而改变

静态监控进程

静态查看进程通常使用 ps 命令


了解进程如下选项:


  1. PID,PPID

  2. 当前的进程状态

  3. 内存的分配情况

  4. CPU 和已花费的时间

  5. 用户 UID 决定进程的特权


[root@liza ~]# ps aux | lessUSER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMANDroot          1  0.0  0.3  46276  5836 ?        Ss   Feb27   0:46 /usr/lib/systemd/systemd --system --deserialize 21USER:   //运行进程的用户PID:    //进程 ID%CPU:   //CPU 占用率%MEM:   //内存占用率VSZ:    //占用虚拟内存RSS:    //占用实际内存 驻留内存 TTY:    //进程运行的终端STAT:   //进程状态 man ps (/STATE)    R   //进程运行    S   //可中断睡眠    D   //不可中断睡眠    Z   //僵尸进程    X   //进程已经退出    T   //进程被暂停    Ss s        //进程的领导者,父进程    S< <        //优先级较高的进程    SN N        //优先级较低的进程    R+ +        //表示是前台的进程组    Sl          //以线程的方式运行    START:      //进程的启动时间    TIME:       //进程占用 CPU 的总时间    COMMAND:    //进程文件,进程名
复制代码
ps 命令使用方法

对进程的 CPU 进行排序展示


[root@liza ~]# ps aux --sort %cpu |less[root@liza ~]# ps aux --sort -%cpu |less
复制代码


自定义显示字段


[root@liza ~]# ps axo user,pid,ppid,%mem,command |grep nginxroot      14724  14498  0.0 grep --color=auto nginx
复制代码


显示进程的子进程


[root@liza ~]# yum install -y httpd[root@liza ~]# systemctl restart httpd[root@liza ~]# ps auxf | grep httpdroot      14940  0.0  0.0 112660   972 pts/1    S+   15:55   0:00          \_ grep --color=auto httpdroot      14915  0.0  0.2 226240  5164 ?        Ss   15:54   0:00 /usr/sbin/httpd -DFOREGROUNDapache    14925  0.0  0.1 228324  3156 ?        S    15:55   0:00  \_ /usr/sbin/httpd -DFOREGROUNDapache    14926  0.0  0.1 228324  3156 ?        S    15:55   0:00  \_ /usr/sbin/httpd -DFOREGROUNDapache    14927  0.0  0.1 228324  3156 ?        S    15:55   0:00  \_ /usr/sbin/httpd -DFOREGROUNDapache    14928  0.0  0.1 228324  3156 ?        S    15:55   0:00  \_ /usr/sbin/httpd -DFOREGROUNDapache    14929  0.0  0.1 228324  3156 ?        S    15:55   0:00  \_ /usr/sbin/httpd -DFOREGROUND
复制代码


查看指定进程 PID


[root@liza ~]# ps aux | grep sshd.pidroot      14942  0.0  0.0 112660   980 pts/1    S+   15:56   0:00 grep --color=auto sshd.pid[root@liza ~]# cat /run/sshd.pid 1250
复制代码


pgrep 常用参数, -l -a


[root@liza ~]# pgrep sshd125014494[root@liza ~]# pidof sshd14494 1250
复制代码


查看进程树


[root@liza ~]# pstree
复制代码

动态监控进程

[root@liza ~]# top[root@liza ~]# top -d 1[root@liza ~]# top -d 1 -p 10126[root@liza ~]# top -d 1 -p 10126,1 [root@liza ~]# top -d 1 -u apache[root@liza ~]# top -d 1 -b -n 2 > top.txt
复制代码


top 常见指令h 查看帮出z 以彩色信息展示1 显示所有CPU的负载s 设置刷新时间b 高亮现实处于R状态的进程M 按内存使用百分比排序输出P 按CPU使用百分比排序输出R 对排序进行反转f 自定义显示字段k kill掉指定PID进程W 保存top环境设置 ~/.toprcq 退出

系统负载的计算和意义

进程以及子进程和线程产生的计算指令都会让 cpu 执行,产生请求的这些进程组成”运行队列”,等待 cpu 执行,这个队列就是系统负载, 系统负载是所有 cpu 的运行队列的总和


[root@liza ~]# w 16:04:41 up 30 min,  2 users,  load average: 0.00, 0.01, 0.05USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHATroot     :0       :0               03Jan21 ?xdm?  28.35s  0.10s /usr/libexec/gnome-session-binary --session gnome-classicroot     pts/1    192.168.112.1    15:37    1.00s  0.30s  0.02s w
复制代码
假设当前计算机有 4 个核心的 cpu,当前的负载是 2.92

cpu1 cpu2 cpu3 cpu4


2.94/4(个 cpu 核心) = 73%的 cpu 资源被使用,剩下 27%的 cpu 计算资源是空想的

假设当前的计算有 2 个核心的 cpu,当前的负载是 2.92

2.92/2 = 146% 已经验证超过了 cpu 的处理能力



信号管理进程

  1. 使用 kill 命令发送信号与进程通信

  2. 定义守护进程的角色

  3. 结束用户会话和进程


kill,killall,pgrep,pkill

列出所有支持的信号
[root@liza ~]# kill -l 1) SIGHUP   2) SIGINT   3) SIGQUIT   4) SIGILL   5) SIGTRAP 6) SIGABRT   7) SIGBUS   8) SIGFPE   9) SIGKILL  10) SIGUSR111) SIGSEGV  12) SIGUSR2  13) SIGPIPE  14) SIGALRM  15) SIGTERM16) SIGSTKFLT  17) SIGCHLD  18) SIGCONT  19) SIGSTOP  20) SIGTSTP21) SIGTTIN  22) SIGTTOU  23) SIGURG  24) SIGXCPU  25) SIGXFSZ26) SIGVTALRM  27) SIGPROF  28) SIGWINCH  29) SIGIO  30) SIGPWR31) SIGSYS  34) SIGRTMIN  35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+338) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+843) SIGRTMIN+9  44) SIGRTMIN+10  45) SIGRTMIN+11  46) SIGRTMIN+12  47) SIGRTMIN+1348) SIGRTMIN+14  49) SIGRTMIN+15  50) SIGRTMAX-14  51) SIGRTMAX-13  52) SIGRTMAX-1253) SIGRTMAX-11  54) SIGRTMAX-10  55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-758) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-263) SIGRTMAX-1  64) SIGRTMAX  
复制代码
数字信号 信号别名 作用

1 HUP 挂起信号,往往可以让进程重新配置


2 INT 中断信号,起到结束进程的作用,和ctrl + c 的作用一样


3 QUIT 让进程退出,结果是进程退出


9 KILL 直接结束进程,不能被进程捕获


15 TERM 进程终止,这是默认信号


18 CONT 被暂停的进程将继续恢复运行


19 STOP 暂停进程


20 TSTP 用户停止请求,作用类似于ctrl + z 把进程放到后台并暂停



后台进程管理

作业控制是一个命令行功能,允许一个 shell 实例来运行和管理多个命令。


如果没有作业控制,父进程 fork()一个子进程后,将 sleeping,直到子进程退出。


使用作业控制,可以选择性暂停,恢复,以及异步运行命令,让 shell


可以在子进程运行期间返回接受其他命令。


前台进程,后台进程jobs,bg,fg ctrl + Z ,ctrl + C, ctrl + B

运行程序(时),让其在后台执行
[root@liza ~]# sleep 3000 &[1] 15235
复制代码
将前台的程序挂起(暂停)到后台
[root@liza ~]# sleep 4000[2]+ Stopped sleep 4000[root@liza ~]# ps aux |grep sleeproot      15235  0.0  0.0 107904   348 pts/1    S    16:14   0:00 sleep 3000root      15243  0.0  0.0 107904   612 ?        S    16:14   0:00 sleep 60root      15247  0.0  0.0 112660   972 pts/1    S+   16:15   0:00 grep --color=auto sleep
复制代码
查看后台作业查
[root@liza ~]# jobs[1]- Running sleep 3000 & [2]+ Stopped sleep 4000
复制代码
让作业 2 在后台运行
[root@liza ~]# bg %2
复制代码
将作业 1 调回到前台
[root@liza ~]# fg %1
复制代码
kill 1,终止 PID 为 1 的进程
[root@liza ~]# kill %1
复制代码
进程在后台运行,但输出依然在当前终端
[root@liza ~]# (while :; do date; sleep 2; done) &[root@liza ~]# (while :; do date; sleep 2; done) &>/dev/null &[2] 15376[1]   Terminated              ( while :; do    date; sleep 2;done )
复制代码


发布于: 刚刚阅读数: 4
用户头像

🏅️ InfoQ 专家博主 2022.03.08 加入

CSDN:飞向星的客机

评论

发布
暂无评论
系统管理-Linux系统进程管理_Linux_飞向星的客机_InfoQ写作社区