RHCASA之系统进程管理

发布时间 2024-01-12 22:04:38作者: 代码你敲我不敲

什么是进程

在linux系统中,触发任何一个事件时,系统都会讲他定义成为一个进程。并且回给予这个进程一个ID,称为PID,同时根据出发这个进程的用户与相关属性关系,会给予这个进程一个一组有效的权限设置。

进程与程序

进程的产生

一般来说,执行一个程序或命令就可以触发一个事件而获取一个PID。

任务管理

了解任务管理

这个任务管理(jio control)是用在bash环境下的,也就是当我们登录系统获取bash shell之后,在单一终端下同时执行多个任务的操作管理。

什么是任务管理

执行任务管理操作中,其实每个任务都是目前bash的子进程,即彼此之间是有相关性的,我们无法用任务管理的方式有tty1的环境去管理tty2的bash。

假设我们只有一个终端,因此出现提示符让你操作的环境就成为前台(foreground),至于其他任务可以放在后台(background)去暂停或运行。注意,放入后台的任务想要运行时,他必须不能和用户交互。

总结

总之,要执行bash的任务管理必须要注意到的限制是:
    1.这些任务所触发的进程必须来自于你的shell的子进程(只管理自己的bash)
    2.前台:可以控制与执行米杠零的这个环境称为前台的服务(foreground)
    3.后台:可以自动执行的任务,你无法使用[ctrl+c]终止它,可以使用bg,fg调用该任务
    4.后台中执行的进程不能等待terminal或shell的输入(input),否则会一直等待。

job control的管理

bash只能够管理自己的任务而不能管理其他bash的任务,所以即使使用者为root也不能够将别的bash下的job拿过来执行。

后台的状态

在后台的任务状态可以分为`暂停(stop)`和`运行(running)`

实际执行job控制的命令

  1. &
    意义:将任务丢到后台执行,并返回到当前终端
    用法:输入一个命令,在该命令的最后面加入一个&(bash会给这个命令一个任务号码job number,就是[1])

    放入后台

     [root@localhost test]# tar -zpcf lnmp.tarrr  lnmp &
     [1] 2272      #[1]是job number 2272是pid
     [root@localhost test]# ls
     lnmp  lnmp.tarrr  lnmp.zip
     [1]+  Done    #Done表示完成         tar -zpcf lnmp.tarrr  lnmp
    

    放入后台后仍会输出信息,但前台操作正常

     [root@localhost test]# unzip lnmp.zip &
     [1] 2320
     [root@localhost test]# Archive:  lnmp.zip
     creating: lnmp/
     creating: lnmp/lnmp/
     inflating: lnmp/lnmp/alsa-lib-1.1.8-1.el7.x86_64.rpm  
     inflating: lnmp/lnmp/apr-1.4.8-5.el7.x86_64.rpm  
     inflating: lnmp/lnmp/apr-util-1.5.2-6.el7.x86_64.rpm  
     inflating: lnmp/lnmp/libxcb-1.13-1.el7.x86_64.rpm  
     [root@localhost test]#    #可以发现这个操作放入后台仍会输出信息,但此时我们正常前台操作不会受影响
     inflating: lnmp/lnmp/libXcomposite-0.4.4-4.1.el7.x86_64.rpm  
     [1]+  Done                    unzip lnmp.zip
    

    放入后台,不输出信息到前台

    [root@localhost test]# unzip lnmp.zip > tar.txt &  #我们可以使用重定向符号将输出的信息放入文件中,从而不在前台输出
     [2] 2336
     [root@localhost test]# ls
     lnmp  lnmp.tarrr  lnmp.zip  tar.txt
     [2]-  Done                    unzip lnmp.zip > tar.txt
    
  2. crtl+z
    意义:将目前的任务丢到后台中暂停
    用法:直接按住ctrl+z

    [root@localhost test]# vim tar.txt 
    [2]+  Stopped                 vim tar.txt
    
  3. jobs
    意义:查看目前的的后台任务状态
    选项:

    选项 解释
    -l 列出job number,命令串,和pid
    -r 仅列出正在后台run的任务
    -s 仅列出在后台当中暂停(stop)的任务

    用法:

    查看当前后台任务状态
    [root@localhost test]# jobs 
    [1]-  Stopped                 unzip lnmp.zip > tar.txt
    [2]+  Stopped                 vim tar.txt
    
    查看当前后台任务状态,列出job number,命令串,和pid
    [root@localhost test]# jobs -l
    [1]-  2330 Stopped (tty input)     unzip lnmp.zip > tar.txt
    [2]+  2352 Stopped                 vim tar.txt
    
    查看当前后台任务状态,仅列出正在后台run的任务
    [root@localhost test]# jobs -r
    [3]   Done                    unzip lnmp.zip > tar.txt
    
    查看当前后台任务状态,仅列出在后台当中暂停(stop)的任务
    [root@localhost test]# jobs 
    [1]   Stopped                 unzip lnmp.zip > tar.txt
    [2]-  Stopped                 vim tar.txt
    [3]+  Stopped                 vim a.txt
    
    (加号表示最近被放到后台的任务号码,-表示第二个被放置到后台的任务号码,而第三个及以后就不会有`+`,`-`的存在了)
  4. fg
    意义:将后台的任务拿到前台来处理
    选项:

    选项 解释
    &jobnumber 取出job number为jobnumber的任务(%可有可无)

    用法:
    fg(默认取出+任务)

    [root@localhost test]# fg
    vim tar.txt
    [2]+  Stopped                 vim tar.txt
    

    fg %2(取出jobnumber是3的任务,%可有可无)

    [root@localhost test]# fg %2
    vim a.txt
    [2]+  Stopped                 vim a.txt
    
    如果出现第二次取出的任务就是第一次取出的任务,可能是因为,你第一次取出之后挂后台,那么此时刚刚取出的就会变成+任务
  5. bg
    意义:让任务在后台下的状态变成运行中
    用法:
    bg %jobnumber 让job number为jobnumber的任务变成运行中

    [root@localhost test]# jobs ;bg %4 ;jobs 
    [1]   Stopped                 vim a.txt
    [2]   Stopped                 vim tar.txt
    [3]-  Stopped                 find etc / > find.txt
    [4]+  Stopped                 find etc / > find.txt
    [4]+ find etc / > find.txt &
    [1]   Stopped                 vim a.txt
    [2]-  Stopped                 vim tar.txt   
    [3]+  Stopped                 find etc / > find.txt
    [4]   Running                 find etc / > find.txt &
    
  6. kill
    意义:管理后台当中的任务(一般来说,如果想要删除,重新启动任务的话需要发送信号signal
    选项:

    选项 解释
    -l 列出目前kill能够使用的信号(signal)

    用法:
    kill -signal %jobnumber -signal代表要发送什么样的指示给后面的任务
    signal选项:

    选项 解释
    -1 重新读取一次参数的配置文件(类似于reload)
    -2 代表由键盘输入[ctrl+c]同样的操作
    -9 立刻强制删除一个任务
    -15 以正常的进程方式终止一项任务,与-9并不相同
    [root@localhost test]# kill -9 %3;jobs 
    [3]+  Stopped                 find etc / > find.txt
    [3]+  Killed                  find etc / > find.txt
    

    注意:
    一般来说,kill后面接的数字默认为pid,如果是job number,要记得加上%
    -9和-15是不同的,比如要使用kill关掉一个vim任务,那么使用前者和后者的结果是不一样的。vim生成的.swp文件并不会删除,而后者正常关闭vim任务会删除.swp文件。

进程之间的通信方式

进程和进程的沟通方法有管道、信号、消息队列、共享内存、socket套接字等。Linux中默认使用信号进行通信

当进程接受到信号后,优先执行信号的操作;
信号的产生:内核产生;用户手动发送信号
发送信号:
	根据进程id    kill 工具
	根据进程名     killall  (会一并关闭所有的进程)结束一整个中断的进程 

脱机管理

上面所做的放入后台的操作,其实指的是ctrl+c中断不了。而并不是真的放入了系统后台,比如,你是以远程连接的方式连接的主机,把任务&,放入后台,在任务未完成的情况下,你脱机了,任务不会继续进行,而会被中断。(如果想要脱机之后仍然可以执行任务,建议使用`at`,`nohup`) 

管理进程

ps 查看静态进程

[root@localhost ~]# ps
    PID TTY          TIME CMD
   2109 pts/0    00:00:00 bash
   2132 pts/0    00:00:00 ps

ps默认只能查看当前终端
ps -l 仅查看自己的bash相关进程

[root@localhost test]# ps -l
F S   UID     PID    PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S     0    2047    2046  0  80   0 - 58341 do_wai pts/0    00:00:00 bash
4 R     0    2701    2047  0  80   0 - 56375 -      pts/0    00:00:00 ps

解释
F 代表进程标识(process flags),说明这个进程的权限,常见号码:4:表示此进程权限为root;1:表示此子进程仅执行一直(fork)而没有实际执行(exec)
S 代表这个进程的状态R(Running):该进程正在运行中;S(Sleep):该进程正在睡眠中(idle),但可以被唤醒(signal);D:不可被唤醒的睡眠状态;T(stop):;Z(Zombie):
UID/PID/PPID 被uid所拥有/进程的PID号/此进城的父进程的PID
C 代表cpu的使用率,单位为%
PRI/NI 代表次进程被cpu所执行的优先级(数值越小越快执行)
ADDR/SZ/WCHAN 都和内存有关。
TTY 得到终端的方式1.pts:表示为终端(远程ssh连接,图形化登录);2.tty(1-6):表示终端设备。tty2:表示有桌面;3.图形化的环境;4. ?:表示没有终端,是内核进程
TIME 表示进程的持续时间 如果是00:00(一种可能,刚刚发起;另一种可能,持续的在进行)
CMD 运行的命令

扩展:

[root@localhost test]# w #查看当前系统有多少个用户在登陆
 17:12:34 up  1:09,  2 users,  load average: 0.00, 0.00, 0.00
USER     TTY        LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty2      16:03    1:09m  0.02s  0.02s /usr/libexec/gnome-session-binary
root     pts/0     16:03    0.00s  0.71s  0.01s w

如果想要查看所有终端上的进程,则使用-a选项

选项

选项 解释
-a 查看所有终端执行的进程
-x 查看不属于终端的进程
-u 查看用户
-o 指定选项
-e 查看所有进程
-f 查看用户PID PPID C(CPU资源占用) stime command
--sort 按照指定顺序排序[ps -aux --sort=(-[加这个减号代表按照从高到低排序])%cpu](默认是从低到高)

eg:ps -ao user,%cpu,%men,command

[root@localhost ~]# ps -aux|head  -n 5
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.3 171628 15876 ?        Ss   19:52   0:01 /usr/lib/systemd/systemd rhgb --switched-root --system --deserialize 31
root           2  0.0  0.0      0     0 ?        S    19:52   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<   19:52   0:00 [rcu_gp]
root           4  0.0  0.0      0     0 ?        I<   19:52   0:00 [rcu_par_gp]
[root@localhost ~]# 
解释
USER 用户
PID PID
%CPU 占用的cpu的百分比
%MEM 占用的内存的百分比
VSZ 这个进程所占用的虚拟内存
RSS 这个进程所占用的实际内存
TTY 获取终端的方式
STAT 状态(s 休眠)
START 进程开启的时间
TIME 占用cpu的时间
COMMAND 进程执行的命令
pstree
[root@localhost test]# pstree
systemd─┬─ModemManager───3*[{ModemManager}]
        ├─NetworkManager───2*[{NetworkManager}]
        ├─VGAuthService
        ├─accounts-daemon───3*[{accounts-daemon}]
        ├─alsactl
        ├─atd
        ├─auditd─┬─sedispatch
        │        └─2*[{auditd}]
        ├─avahi-daemon───avahi-daemon
        ├─colord───3*[{colord}]
        ├─crond
        ├─cupsd
        ├─dbus-broker-lau───dbus-broker
        ├─firewalld───{firewalld}
        ├─gdm─┬─gdm-session-wor
        │     ├─gdm-session-wor─┬─gdm-wayland-ses─┬─gnome-session-b───3*[{gnome-s+
        │     │                 │                 └─2*[{gdm-wayland-ses}]
        │     │                 └─2*[{gdm-session-wor}]
        │     └─2*[{gdm}]
        ├─gnome-keyring-d───3*[{gnome-keyring-d}]
        ├─irqbalance───{irqbalance}
        ├─lsmd
        ├─packagekitd───2*[{packagekitd}]
        ├─polkitd───5*[{polkitd}]
        ├─power-profiles-───2*[{power-profiles-}]
        ├─rhsm-service───{rhsm-service}
        ├─rhsmcertd
        ├─rsyslogd───2*[{rsyslogd}]
        ├─rtkit-daemon───2*[{rtkit-daemon}]
        ├─sshd───sshd───sshd───bash───pstree
        ├─sssd_kcm
        ├─switcheroo-cont───2*[{switcheroo-cont}]
        ├─systemd─┬─(sd-pam)
        │         ├─at-spi-bus-laun─┬─dbus-broker-lau───dbus-broker
        │         │                 └─3*[{at-spi-bus-laun}]
        │         ├─at-spi2-registr───2*[{at-spi2-registr}]
        │         ├─dbus-broker-lau───dbus-broker
        │         ├─dconf-service───2*[{dconf-service}]
        │         ├─evolution-addre───5*[{evolution-addre}]
        │         ├─evolution-calen───8*[{evolution-calen}]
        │         ├─evolution-sourc───3*[{evolution-sourc}]
        │         ├─2*[gjs───4*[{gjs}]]
        │         ├─gnome-session-b─┬─evolution-alarm───5*[{evolution-alarm}]
        │         │                 ├─gnome-software───3*[{gnome-software}]
        │         │                 ├─gsd-disk-utilit───2*[{gsd-disk-utilit}]
        │         │                 └─3*[{gnome-session-b}]
        │         ├─gnome-session-c───{gnome-session-c}
        │         ├─gnome-shell─┬─Xwayland
        │         │             ├─ibus-daemon─┬─ibus-dconf───3*[{ibus-dconf}]
        │         │             │             ├─ibus-engine-sim───2*[{ibus-engine+
        │         │             │             ├─ibus-extension-───3*[{ibus-extens+
        │         │             │             └─2*[{ibus-daemon}]
        │         │             └─13*[{gnome-shell}]
        │         ├─gnome-shell-cal───5*[{gnome-shell-cal}]
        │         ├─goa-daemon───3*[{goa-daemon}]
        │         ├─goa-identity-se───3*[{goa-identity-se}]
        │         ├─gsd-a11y-settin───3*[{gsd-a11y-settin}]
        │         ├─gsd-color───3*[{gsd-color}]
        │         ├─gsd-datetime───3*[{gsd-datetime}]
        │         ├─gsd-housekeepin───3*[{gsd-housekeepin}]
        │         ├─gsd-keyboard───3*[{gsd-keyboard}]
        │         ├─gsd-media-keys───3*[{gsd-media-keys}]
        │         ├─gsd-power───3*[{gsd-power}]
        │         ├─gsd-print-notif───2*[{gsd-print-notif}]
        │         ├─gsd-printer───2*[{gsd-printer}]
        │         ├─gsd-rfkill───2*[{gsd-rfkill}]
        │         ├─gsd-screensaver───2*[{gsd-screensaver}]
        │         ├─gsd-sharing───3*[{gsd-sharing}]
        │         ├─gsd-smartcard───5*[{gsd-smartcard}]
        │         ├─gsd-sound───3*[{gsd-sound}]
        │         ├─gsd-subman───3*[{gsd-subman}]
        │         ├─gsd-usb-protect───3*[{gsd-usb-protect}]
        │         ├─gsd-wacom───3*[{gsd-wacom}]
        │         ├─gsd-xsettings───3*[{gsd-xsettings}]
        │         ├─gvfs-goa-volume───2*[{gvfs-goa-volume}]
        │         ├─gvfs-gphoto2-vo───2*[{gvfs-gphoto2-vo}]
        │         ├─gvfs-mtp-volume───2*[{gvfs-mtp-volume}]
        │         ├─gvfs-udisks2-vo───3*[{gvfs-udisks2-vo}]
        │         ├─gvfsd───2*[{gvfsd}]
        │         ├─gvfsd-fuse───5*[{gvfsd-fuse}]
        │         ├─gvfsd-metadata───2*[{gvfsd-metadata}]
        │         ├─ibus-portal───2*[{ibus-portal}]
        │         ├─ibus-x11───2*[{ibus-x11}]
        │         ├─vmtoolsd───3*[{vmtoolsd}]
        │         └─xdg-permission-───2*[{xdg-permission-}]
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        ├─udisksd───4*[{udisksd}]
        ├─upowerd───2*[{upowerd}]
        ├─vmtoolsd───3*[{vmtoolsd}]
        ├─vmware-vmblock-───2*[{vmware-vmblock-}]
        └─wpa_supplicant

top 动态查看进程的变化

选项与参数

选项 结束
-d 接秒数,设置刷新的秒数
-b 以批量的方式执行top,通常会搭配重定向来将批量的结果输出成文件
-n 加数字与-b搭配,需要执行几次top的输出结果
-p 指定某个pid来执行查看监测

top顶栏解释

[root@localhost test]# top|head 
top - 20:32:21(开机时间) up  4:29(开机到现在所经过的时间),  2 users(已经登录系统的用户人数),  load average: 0.01, 0.02, 0.00(系统在1.5.15分钟的,系统平均要负责运行几个进程(数字越小越闲置,高于1太频繁))
Tasks: 284 total (目前的进程总量),   1 running, 282 sleeping,   0 stopped,   1 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st (显示的是cpu的整体负载)
MiB Mem :   3888.4 total,   1657.6 free,   1037.6 used,   1193.1 buff/cache (虚拟内存的使用情况)
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.   2536.2 avail Mem (物理内存的使用情况)

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+(cpu的使用时间的累加) COMMAND   
   2744 root      20   0  226032   4296   3408 R   5.9   0.1   0:00.01 top       
      1 root      20   0   24200  15812  10476 S   0.0   0.4   0:01.43 systemd   
      2 root      20   0       0      0      0 S   0.0   0.0   0:00.01 kthreadd 

top命令的交互模式(可以上下键移动)

参数 解释
1 查看每个逻辑cpu的资源信息
M 按照占用内存的百分比进行排序
m 查看内存进度条模式的百分比
P 按照cpu的百分比进行排序
c 显示命令的名称
T 根据占用时间进行排序
K 杀死pid(顶栏下一行)
q 退出top命令
r 给予某个pid重新制定一个nice值

举例

  • 查看单一进程
[root@localhost test]# top -d 2 -p 2047
top - 20:44:09 up  4:41,  2 users,  load average: 0.08, 0.02, 0.00
Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.2 us(用户空间占用cpu百分比.例如shell程序、开启的应用软件、桌面等),  0.0 sy(内核空间占用cpu百分比.例如系统分配内存、执行的IO操作等),  0.0 ni(用户自定义优先级的进程占用cpu百分比), 99.3 id(cpu的空闲百分比),  0.0 wa(等待磁盘IO操作的时间。时间越长,表示cpu和磁盘的性能差距越大,要检测是不是系统有非常的IO),  0.2 hi(硬中断.表示硬盘、网卡等硬件设备发送CPU的中断消息,CPU处理消),  0.2 si(软中断.表示软件发送CPU的中断消息,CPU处理消耗的时间
),  0.0 st(虚拟机等待cpu的时间.只有当系统是虚拟机的时候关注此项)
MiB Mem :   3888.4 total,   1657.2 free,   1038.1 used,   1193.1 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.   2535.8 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND   
   2047 root      20   0  233364   9724   6220 S   0.0   0.2   0:00.86 bash  
  • 将top的信息执行两次,输出到一个文件中保存
[root@localhost test]# top -b -n 2 > top.txt 
[root@localhost test]# cat top.txt
top - 20:46:32 up  4:43,  2 users,  load average: 0.00, 0.01, 0.00
Tasks: 284 total,   1 running, 282 sleeping,   0 stopped,   1 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 
.......

pstree

[root@localhost test]# pstree
systemd─┬─ModemManager───3*[{ModemManager}]
        ├─NetworkManager───2*[{NetworkManager}]
        ├─VGAuthService
        ├─accounts-daemon───3*[{accounts-daemon}]
        ├─alsactl
        ├─atd
        ├─auditd─┬─sedispatch
        │        └─2*[{auditd}]
        ├─avahi-daemon───avahi-daemon
        ├─colord───3*[{colord}]
        ├─crond
       .....
选项 解释
-A 各进程树之间的连接以ASCII字符来连接
-U 各进程树之间的连接以Unicode字符来连接,在某些终端可能会报错
-p 并同时列出pid
-u 同时列出所属账号名称

僵尸进程

  • 如果是僵尸进程,一定要特别重视,会消耗系统的cpu 内存资源。
  • 僵尸进程是指父进程排出子进程工作,但是收不到子进程发送来的信息,此时子进程会一直发送信息,成为僵尸进程,占用资源。
  • 产生原因:程序bug或者人为故意放出病毒。

孤儿进程

  • 如果是孤儿进程,不会占用系统的cpu 内存资源,PID为1的进程(systemd)会接管孤儿进程然后关闭它。
  • 孤儿进程是指父进程退出后,子进程还在运行的进程。
  • 产生原因:用户手动关闭父进程或者程序BUG导致父进程比子进程先退出

扩展命令

pgrep 通过信息查询进程(模糊查询)

选项

选项 解释
-U 通过用户名查找进程
-G 通过用户组查找进程
-u 通过uid查找进程
-g 通过gid查找进程
-P 通过父进程查找子进程
-l 打印命令
-o 如果有多个进程运行,则查找最早运行的进程
-n 如果有多个进程运行,则查找最晚运行的进程eg:pgrep -n / -o vim
-d 指定分隔符(shell脚本中应用的较多)可以把过滤出来的进程根据分隔符进行分割

pidof 根据进程名称查询

pidof必须写全

pkill(ps和kill结合) 可以结束一个终端、一个用户的所有进程

pkill -t tty1   					结束终端1下的进程
pkill -kill  / -9   -t  pts/2  	踢用户
pkill -u 用户    结束指定用户的所有进程
pkill  -9  vim	强制结束进程

进程的优先级

在系统繁忙的时候,高优先级的进程最优先分配CPU资源
优先级越高,进程越优先分配cpu资源
Linux进程中有两种优先级:

  • PR 动态优先级(内核自动调整)
  • NI 静态优先级(用户手动调整)
    ni优先级的范围:-20~19 ;(数字越小,优先级越高;root用户才能修改ni值)

调整ni值

修改已经启动的ni值: renice -n 15 8004
在启动进程的时候调整ni值:nice -n -20 vim a