查看原文
其他

进程管理与计划任务(3)-nohup、ps、top、pstree

Cloud研习社 Cloud研习社 2023-06-06


每周二、四、六定期更新,我们不见不散!



离线管理问题-nohup


我们在工作管理当中提到的『后台』指的是在当前终端模式下可以避免 [crtl]-c 中断的情况, 并不是放到系统的后台去!所以,工作管理的后台依旧与当前终端有关!当前终端退出,任务也就终止了:

如果我的工作需要进行一大段时间,我又不能放置在当前终端的后台中,那该如何处理呢?这就用到了nohup。


[root@studyclub ~]# nohup [命令与参数] <==在当前终端前台中工作
[root@studyclub ~]# nohup [命令与参数] & <==在当前终端后台中工作


注意:nohup 并不支持 bash 内建的命令,因此你的命令必须要是外部命令才行。


[root@studyclub ~]# nohup ./job.sh &
[1] 10174
[root@studyclub ~]# nohup: ignoring input and appending output to ‘nohup.out’ # 提示输出信息的保存位置
[root@studyclub ~]# jobs -l
[1]+ 18250 Running nohup ./job.sh & # jobs已经有了

# 接下来我们退出当前终端
[root@studyclub ~]# logout

# 重新登录linux,并查看jobs
[root@studyclub ~]# ps aux | grep job
root 18250 49.5  0.1 113180  1196 ? R 16:37   0:44 /bin/bash ./job.sh # 之前提交的任务还在



进程管理工具(上)


ps

ps用来获取当前系统中进程的运行情况。

选项与参数:
-A  :所有的 process 都显示出来;
-a  :不与 terminal 有关的所有 process ;
-u  :有效使用者 (effective user) 相关的 process ;
x   :通常与 a 这个参数一起使用,可列出较完整资讯。
输出格式规划:
l   :列出当前bash下的进程信息;
j   :工作的格式 (jobs format)
-f  :做一个更为完整的输出。


我们记住两个选项组合就好:

ps -l # 查阅自己的bash下运行的进程
ps aux # 查看当前系统中运行的所有进程,这个选项组合常用,请记住。注意选项里没有“-”号


  1. 查看当前终端(当前bash)下的进程信息:


[root@studyclub ~]# ps -l
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0  19649  19647  0  80   0 - 28893 do_wai pts/0    00:00:00 bash
0 R     0  19778  19649  0  80   0 - 38309 -      pts/0    00:00:00 ps


我们来看看ps -l的返回结果中,每一列的含义:

F:代表这个进程标识 (process flags),说明这个进程的权限,常见的编号有:
  - 4 表示此程序的权限为 root ;
  - 1 则表示此子进程仅进行复制(fork)而没有实际运行(exec)
S:代表这个程序的状态 (STAT),主要的状态有:
  R (Running):该程序正在运行中;
  S (Sleep):该程序目前正在睡眠状态(idle),但可以被唤醒(signal)。
  D :不可被唤醒的睡眠状态,通常这个进程可能在等待 I/O 
  T :停止状态(stop),可能是在任务控制(后台暂停)或排错 (traced) 状态;
  Z (Zombie):僵尸状态,进程已经终止却无法被删除。
UID/PID/PPID:代表『此进程所属的用户的ID/进程的ID/此进程的父进程的ID
C:代表 CPU 使用率,单位为百分比;
PRI/NIPriority/Nice 的缩写,代表此程序被 CPU 所运行的优先顺序,数值越小代表该程序越快被 CPU 运行
ADDR/SZ/WCHAN:都与内存有关,ADDR 是 kernel function,指出该程序在内存的哪个部分,如果是个 running 的程序,一般就会显示『 - 』 / SZ 代表此程序用掉多少内存,单位为字节 / WCHAN 表示目前程序是否运行中,同样的, 若为 - 表示正在运行中。
TTY:对应用户的终端位置,若为远程登陆则使用动态终端页面 (pts/n);
TIME:使用掉的 CPU 时长,注意,是此进程实际花费 CPU 运行的时长,而不是系统时间;
CMD:就是 command 的缩写,造成此进程的触发程序的命令。


所以上面bash进程属于uid为0的用户,状态为sleep,这个程序拥有roo的权限。该进程的ID是19649,父进程的ID是19647,cpu对它的调度优先级是80,执行bash的终端是pts/0,运行状态为等待。注意,上面的返回结果中,19649这个PID值出现了两次,第一次是在PID的位置,第二次是在PPID的位置,这说明ps命令执行的进程是bash进程创建的子进程。
  1. 查看系统中所有的进程:

[root@studyclub ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1  0.0  0.3 125480  3940 ? Ss Jun15 0:04 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2  0.0  0.0      0     0 ? S Jun15 0:00 [kthreadd]
root 3  0.0  0.0      0     0 ? S Jun15 0:17 [ksoftirqd/0]
root 5  0.0  0.0      0     0 ? S< Jun15 0:00 [kworker/0:0H]
root 7  0.0  0.0      0     0 ? S Jun15 0:00 [migration/0]
......
root 19649  0.0  0.2 115572  2156 pts/0    Ss 09:27   0:00 -bash
......


ps aux返回结果里各字段的意义为:
USER:该 process 属于哪个用户帐号
PID :该 process 的进程ID。
%CPU:该 process 使用掉的 CPU 资源百分比;
%MEM:该 process 所占用的真实内存百分比;
VSZ :该 process 使用掉的虚拟内存量 (KB)
RSS :该 process 占用的固定内存量 (KB)
TTY :该 process 是在哪个终端上运行,若与终端无关则显示 ?,另外, tty1-tty6 是本机上面的程序,若为 pts/0 形式的,则表示为由网络连接进主机的程序。
STAT:该进程目前的状态,状态显示与 ps -l 的 S 标识相同 (R/S/T/Z)
START:该 process 被触发启动的时间;
TIME :该 process 实际使用 CPU 运行的时间。
COMMAND:该进程的实际命令是什么


默认情况下ps aux的结果会按照PID的顺序排列显示。我们还是看进程号为19649的那个bash进程:该进程的用户是root,这用了0.2%的内存,状态为睡眠,进程启动的时间是当天的09:27分【如果不是当天启动的,则只会显示日期,不会显示具体的时、分】。

top

实时查看进程情况。相比于ps,top命令可以持续检测进程运行的状态。

[root@studyclub ~]# top [-d 数字] | top [-bnp]
选项与参数:
-d  :后面可以接秒数,就是整个程序画面更新信息的时间间隔。默认是5秒,表示每5秒更新一次进程的状态信息;
-b  :以批量的方式运行 top ,还有更多的参数可以使用,通常会搭配数据流重导向来将批量的结果输出成为文件。
-n  :与 -b 搭配,意义是,需要进行几次 top 的输出结果。
-p  :查看特定PID的进程状态
top 运行过程当中可以使用的按键命令:
  ? :显示在 top 当中可以输入的按键命令;
  P :以 CPU 的使用资源排序显示;
  M :以 Memory 的使用资源排序显示;
  N :以 PID 来排序
  T :由该 Process 使用的 CPU 时间累积 (TIME+) 排序。
  k :给予某个 PID 一个信号 (signal)
  r :给予某个 PID 重新制订一个 nice 值。
  q :离开 top 软件的按键。



1. 每6s更新一次
[root@studyclub ~]# top -d 6
top - 12:12:17 up 13:05, 1 user, load average: 0.00, 0.01, 0.07
Tasks:  99 total, 1 running, 98 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.2 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.2 si, 0.0 st
KiB Mem : 995892 total, 142552 free, 182364 used, 670976 buff/cache
KiB Swap: 1999868 total, 1999868 free, 0 used. 592112 avail Mem
   PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
 10107 root 20   0       0      0      0 S 0.5  0.0   0:07.09 kworker/0:2    
  6233 root 20   0  300720   6368   4976 S 0.3  0.6   2:27.06 vmtoolsd
  6691 root 20   0  220784   4304   3460 S 0.2  0.4   0:07.82 rsyslogd
  7611 mysql 20   0  968808  88488   7916 S 0.2  8.9   0:30.44 mysqld

2. 查看某个特定进程的情况
[root@studyclub ~]# top -p 20015
top - 13:42:43 up 3 days, 17:06, 1 user, load average: 1.40, 0.40, 0.17
Tasks:   1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie
%Cpu(s): 65.6 us, 31.2 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 3.1 si, 0.0 st
KiB Mem : 995892 total, 62668 free, 112388 used, 820836 buff/cache
KiB Swap: 1999868 total, 1999092 free, 776 used. 651876 avail Mem

   PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
 20015 root 20   0  113180   1196   1016 R 97.7  0.1   0:59.64 job.sh                                                                                      
 
 
3. 修改NI值
在上一个例子的基础上按r,会出现:
top - 13:43:10 up 3 days, 17:07, 1 user, load average: 1.94, 0.64, 0.26
Tasks:   1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie
%Cpu(s): 71.9 us, 26.5 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 1.5 si, 0.0 st
KiB Mem : 995892 total, 63052 free, 112388 used, 820452 buff/cache
KiB Swap: 1999868 total, 1999092 free, 776 used. 652260 avail Mem
PID to renice [default pid = 20015] # 按下r键以后,会出现这一行,直接回车即可【如果不是对20015修改nice值,只需要输入需要修改的PID即可】
   PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
 20015 root 20   0  113180   1196   1016 R 98.3  0.1   1:26.29 job.sh       
 
 回车以后会看到如下信息:
top - 13:46:02 up 3 days, 17:10, 1 user, load average: 2.25, 1.40, 0.62
Tasks:   1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie
%Cpu(s): 72.0 us, 24.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 4.0 si, 0.0 st
KiB Mem : 995892 total, 63628 free, 112388 used, 819876 buff/cache
KiB Swap: 1999868 total, 1999092 free, 776 used. 652836 avail Mem
Renice PID 20015 to value 200    # 这里输入新的nice值(即新的PID号),输入后回车即可
   PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
 20015 root 20   0  113180   1196   1016 R 97.4  0.1   4:14.23 job.sh


回车后看到的画面:

top - 14:41:42 up 15:34, 1 user, load average: 0.03, 0.04, 0.05
Tasks:   1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.1 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 995892 total, 142892 free, 182236 used, 670764 buff/cache
KiB Swap: 1999868 total, 1999868 free, 0 used. 592360 avail Mem

   PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
 20015 root 31  11  115572   2132   1640 S 0.0  0.2   0:00.01 bash


好了,上面说了这么多,那么top命令返回的结果中各个字段到底是什么含义,我们来看一下:第一行(top所在的行): 从左到右依次为:现在的系统时间;从开机到现在所经过的时间(即up 6 min);当系统登录的用户数;系统在最近的1分钟、5分钟、15分钟的平均任务负载,表示最近1、5 、15分钟系统平均要运行的进程数,数值越大,系统负载越多。第二行(Tasks所在的行): 从左到右依次为:当前系统的进程总量;在运行的进程数;在睡眠的进程数;已经停止的进程数;僵尸进程数。这里有个需要注意的就是如果最后一个zombie(僵尸)数不为0,就需要看看是哪个进程处于僵尸状态。第三行(%Cpu(s))所在行: 这里显示cpu的整体负载情况,这里主要关注id指标和wa指标。id指标是指idle,及cpu的空闲情况,数值越高,cpu越空闲。wa指的是wait,即IO wait,这个值越大,系统越卡,说明cpu的大部分时间都用在了等待IO上面。第四、五行:这里是物理内存(Mem)和虚拟内存(Swap)的使用情况。见词知意,就不用解释了吧。第六行:这是一个空行,只有在输入r、k等操作键时才会有信息显示。后面就是按列展示进程的信息了,我们来看每一列的含义:PID: 进程的IDUSER:该进程所属的用户PR:priority,进程的优先执行顺序,数值越小越越优先被执行NI:nice,与priority有关,数值越小越越优先被执行%CPU :cpu的使用率%MEM:内存的使用率TIME+: 进程使用cpu的时长我们再通过一个例子看看top有多重要:查看当前系统所有的进程实时状态并以CPU占用率排序:


[root@studyclub ~]# top        # 执行top命令后,在显示结果后按下大写的P,系统就会把进程按照cpu的占用大小进行排序
top - 14:18:11 up 6 min, 1 user, load average: 1.92, 1.33, 0.64
Tasks: 101 total, 3 running, 98 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 28.7 sy, 71.3 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 995892 total, 765568 free, 97676 used, 132648 buff/cache
KiB Swap: 1999868 total, 1999868 free, 0 used. 743904 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                     
  7099 root      39  19  113180   1196   1016 R 98.3  0.1   5:52.66 job.sh                                                                                      
  7103 root      20   0       0      0      0 S  0.7  0.0   0:00.35 kworker/0:0                                                                                 
     3 root      20   0       0      0      0 S  0.3  0.0   0:01.64 ksoftirqd/0                                                                                 
  6098 root      20   0  300728   6328   4980 S  0.3  0.6   0:00.65 vmtoolsd                                                                                    
     1 root      20   0  125344   3812   2564 S  0.0  0.4   0:02.69 systemd


我们在生产中,如果想要找到最消耗CPU资源或最消耗内存资源的进程时,使用这个top命令就可以,然后强制按照CPU使用资源排序或按照内存使用资源排序,就可以很快知道。这是一个非常有用的命令。

pstree

如果我们想查看进程之间的相关性,就可以通过pstree来完成。pstree在centos最小化安装的时候不会自动安装,需要单独安装:


yum -y install psmisc


pstree命令的语法:


pstree [-p]
选项
-p  列出进程关系的同时,把各进程的PID也显示出来


我们来看看实例:


[root@studyclub ~]# pstree
systemd─┬─NetworkManager─┬─dhclient
        │ └─2*[{NetworkManager}]
        ├─VGAuthService
    ...... # 进程数太多,为节约篇幅,雷哥就省略了
        ├─master─┬─pickup
        │ └─qmgr
        ├─nginx───nginx
        ├─polkitd───6*[{polkitd}]
    ......
        ├─vmtoolsd───{vmtoolsd}
        └─xinetd

[root@studyclub ~]# pstree -p    # 带进程号查看进程之间的关系,进程号显示在小括号()里。
systemd(1)─┬─NetworkManager(6148)─┬─dhclient(6476)
           │ ├─{NetworkManager}(6239)
           │ └─{NetworkManager}(6246)
      ..... # 进程数太多,为节约篇幅,雷哥就省略了
           ├─gssproxy(6126)─┬─{gssproxy}(6133)
           │ ├─{gssproxy}(6134)
           │ ├─{gssproxy}(6135)
           │ ├─{gssproxy}(6136)
           │ └─{gssproxy}(6137)
           ├─master(6971)─┬─pickup(6974)
           │ └─qmgr(6975)
      ......
           ├─vmtoolsd(6098)───{vmtoolsd}(6257)
           └─xinetd(6810)


通过pstree的输出我们也可以看到,所有的进程都依附于systemd下,并且systemd的进程号是1号,这也是linux内核主动调用的第一个进程。


新手应知:

    尝鲜Rocky Linux

《Linux基础及进阶》:

    037 - 文件打包与压缩(2)-打包命令tar    038 - 文件打包与压缩(3)-xfs文件系统的备份与还原    039 - 文件打包与压缩(4)-dd命令详解    040 - 进程管理与计划任务(1)-进程管理与job control    041 - 进程管理与计划任务(2)-工作的前后台管理


看完本文有收获?请分享给更多人


推荐关注「Cloud研习社」,带你从零开始掌握云计算技术!

微信号|bjdream-1


Cloud研习社 · 

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存