进程管理与计划任务(3)-nohup、ps、top、pstree
每周二、四、六定期更新,我们不见不散!
离线管理问题-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 # 查看当前系统中运行的所有进程,这个选项组合常用,请记住。注意选项里没有“-”号
查看当前终端(当前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/NI:Priority/Nice 的缩写,代表此程序被 CPU 所运行的优先顺序,数值越小代表该程序越快被 CPU 运行
ADDR/SZ/WCHAN:都与内存有关,ADDR 是 kernel function,指出该程序在内存的哪个部分,如果是个 running 的程序,一般就会显示『 - 』 / SZ 代表此程序用掉多少内存,单位为字节 / WCHAN 表示目前程序是否运行中,同样的, 若为 - 表示正在运行中。
TTY:对应用户的终端位置,若为远程登陆则使用动态终端页面 (pts/n);
TIME:使用掉的 CPU 时长,注意,是此进程实际花费 CPU 运行的时长,而不是系统时间;
CMD:就是 command 的缩写,造成此进程的触发程序的命令。
查看系统中所有的进程:
[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
......
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
[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内核主动调用的第一个进程。
新手应知:
《Linux基础及进阶》:
037 - 文件打包与压缩(2)-打包命令tar 038 - 文件打包与压缩(3)-xfs文件系统的备份与还原 039 - 文件打包与压缩(4)-dd命令详解 040 - 进程管理与计划任务(1)-进程管理与job control 041 - 进程管理与计划任务(2)-工作的前后台管理看完本文有收获?请分享给更多人
推荐关注「Cloud研习社」,带你从零开始掌握云计算技术!
微信号|bjdream-1
Cloud研习社 ·