始终不能明白进程的正确理解和定义。就说我自己的理解吧
进程是CPU调度的基本单位,对于unix like来说,当我们登录取得bash时,系统会根据用户的uid和gid分配给我们一个进程,在当前bash下,这个进程就是所有进程的父进程,当我们执行一些命令时,每个命令都由一个新的子进程来完成。
在单一终端下,可以同时进行多项工作,如:一边复制数据,一边查询文件。每一项工作都由独立的子进程来完成,他们的父进程就是当前终端对应bash的那个进程。
对于终端来说分为前台和后台
前台:你可以控制于执行命令的那个环境(串行工作)
后台:可以自行运行的工作,无法使用ctrl+c终端它(并行工作)
如果所有的工作都由前台来做,那么必须等一个工作处理完成才能进行下一个工作,这样做效率很低,因此我们可以把一些不需要人工交互的工作放到后台,使多个工作可以共同执行
说明:前台和后台是针对同一个终端来说,tty1环境是无法管理tty2的
语法:jobs[-lrs]
选项与参数:
-l:列出工作与命令串之外,同时列出PID
-r:仅列出后台run的工作
-s: 仅列出后台stop的工作
举例
[root@localhost tmp]# jobs -l [1]- 9154 停止 vim newfile.txt [2]+ 9368 停止 find / -print [3] 9374 Running tar -jcpP -f /tmp/etc1.tar.bz2 /etc &
以上输出的格式为:工作序号|顺序 PID 状态 命令
顺序:分为(+,-,空白),+号代表最后一个被放到后台的工作;-号代表倒数第二个被放到后台的工作,倒数第三个及以后用空白
[root@localhost tmp]# tar -jcpP -f/tmp/etc.tar.bz2 /etc &
[2] 8985
其中【2】表示工作号,8985表示处理这个工作的子进程号
如果我们将压缩信息显示出来
[root@localhost tmp]# tar �CjcpP -v -f/tmp/etc.tar.bz2 /etc &
虽然这个工作在后台进行,但是输出信息还是会在前台输出的,因此可以应用数据流重定向将输出信息写到文件
[root@localhost tmp]# vim newfile.txt
=>按下 ctrl+z
[1]+ Stopped vimnewfile.txt
语法:fg %工作序号
fg �C
fg +
语法:fg %工作序号
举例:
[root@localhost tmp]# jobs -l;bg %2;jobs -l [1]- 9154 停止 vim newfile.txt [2]+ 9729 停止 tar -jcpP -f /tmp/etc1.tar.bz2 /etc [2]+ tar -jcpP -f /tmp/etc1.tar.bz2 /etc & [1]+ 9154 停止 vim newfile.txt [2]- 9729 Running tar -jcpP -f /tmp/etc1.tar.bz2 /etc &
[root@localhost tmp]# jobs -l;kill -9 %1; jobs -l [1]+ 已杀死 tar -jcpP -f /tmp/etc1.tar.bz2 /etc
语法:
ps aux|ps -lA 查看系统所有进程数据
ps �Cl 查看自己相关进程
ps �Caxjf 查看进程树
举例:
[root@localhost ~]# su -l tkf [tkf@localhost tmp]$ tar -cjPp -f ./home.bz2 /home [1]+ Stopped tar -cjPp -f ./home.bz2 /home 查看ps -l [tkf@localhost tmp]$ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 500 10894 10893 0 75 0 - 1224 wait pts/1 00:00:00 bash 0 T 500 10951 10894 0 78 0 - 1224 finish pts/1 00:00:00 tar 0 T 500 10952 10951 0 78 0 - 2289 finish pts/1 00:00:01 bzip2 查看ps -lA [tkf@localhost tmp]$ ps �ClA F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 1 0 0 75 0 - 544 stext ? 00:00:00 init 0 R 0 10691 1 0 75 0 - 20262 stext ? 00:00:01 gnome-terminal 4 S 0 10694 10691 0 77 0 - 649 stext ? 00:00:00 gnome-pty-help 0 S 0 10695 10691 0 76 0 - 1253 wait pts/1 00:00:00 bash 4 S 0 10893 10695 0 78 0 - 1319 wait pts/1 00:00:00 su 4 S 500 10894 10893 0 75 0 - 1224 wait pts/1 00:00:00 bash 0 T 500 10951 10894 0 78 0 - 1224 finish pts/1 00:00:00 tar 0 T 500 10952 10951 0 78 0 - 2289 finish pts/1 00:00:01 bzip2
处理Init程序的进程为所有进程的父进程 tar命令内部会调用bzip2命令因此产生10952进程,且bzip2进程的父进程就是tar进程
l F:代表这个程序旗标 (process flags),说明这个程序的总结权限,常见号码有:
若为 4 表示此程序的权限为root ;
若为 1 则表示此子程序仅进行复制(fork)而没有实际运行(exec)。
l S:代表这个程序的状态 (STAT),主要的状态有:
R (Running):该程序正在运行中;
S (Sleep):该程序目前正在睡眠状态(idle),但可以被唤醒(signal)。
D :不可被唤醒的睡眠状态,通常这支程序可能在等待 I/O 的情况(ex>列印)
T :停止状态(stop),可能是在工作控制(背景暂停)或除错 (traced) 状态;
Z (Zombie):僵尸状态,程序已经终止但却无法被移除至内存外。
l UID/PID/PPID:代表[此程序被该 UID 所拥有/程序的 PID 号码/此程序的父程序 PID 号码]
l C:代表 CPU 使用率,单位为百分比;
l PRI/NI:Priority/Nice 的缩写,代表此程序被 CPU 所运行的优先顺序,数值越小代表该程序越快被 CPU 运行。
l ADDR/SZ/WCHAN:都与内存有关,ADDR 是 kernel function,指出该程序在内存的哪个部分,如果是个 running 的程序,一般就会显示[- ] / SZ 代表此程序用掉多少内存 / WCHAN 表示目前程序是否运行中,同样的,若为 - 表示正在运行中。
l TTY:登陆者的终端机位置,若为远程登陆则使用动态终端介面 (pts/n);
l TIME:使用掉的 CPU 时间,注意,是此程序实际花费 CPU 运行的时间,而不是系统时间;
l CMD:简单描述命令
查看ps aux [tkf@localhost tmp]$ ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 2176 640 ? Ss 08:50 0:00 init [5] root 10691 0.1 0.8 81336 17104 ? Sl 15:03 0:04 gnome-terminal root 10694 0.0 0.0 2596 676 ? S 15:03 0:00 gnome-pty-helper root 10695 0.0 0.0 5012 1476 pts/1 Ss 15:03 0:00 bash root 10893 0.0 0.0 5276 1312 pts/1 S 15:16 0:00 su -l tkf tkf 10894 0.0 0.0 4896 1444 pts/1 S 15:16 0:00 -bash tkf 10951 0.0 0.0 4896 992 pts/1 T 15:18 0:00 tar -cjPp -f ./home.bz2 /home tkf 10952 0.0 0.3 9156 7792 pts/1 T 15:18 0:01 bzip2
USER:该 process 属於那个使用者帐号的?
PID :该 process 的程序识别码。
%CPU:该 process 使用掉的 CPU 资源百分比;
%MEM:该 process 所占用的实体内存百分比;
VSZ :该 process 使用掉的虚拟内存量 (Kbytes)
RSS :该 process 占用的固定的内存量 (Kbytes)
TTY :该 process 是在那个终端机上面运行,若与终端机无关则显示 ?,另外, tty1-tty6 是本机上面的登陆者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。
STAT:该程序目前的状态,状态显示与 ps -l 的 S 旗标相同 (R/S/T/Z)
START:该 process 被触发启动的时间;
TIME :该 process 实际使用 CPU 运行的时间。
COMMAND:详细描述命令
查看ps axjf [tkf@localhost tmp]$ ps axjf PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND 1 10691 4628 4628 ? -1 Sl 0 0:06 gnome-terminal 10691 10694 4628 4628 ? -1 S 0 0:00 \_ gnome-pty-helper 10691 10695 10695 10695 pts/1 11743 Ss 0 0:00 \_ bash 10695 10893 10893 10695 pts/1 11743 S 0 0:00 \_ su -l tkf 10893 10894 10894 10695 pts/1 11743 S 500 0:00 \_ -bash 10894 10951 10951 10695 pts/1 11743 T 500 0:00 \_ tar -cjPp -f ./home.bz2 /home 10951 10952 10951 10695 pts/1 11743 T 500 0:01 | \_ bzip2
语法:top[-d 数字] [-bn 数字] [-p pid]
选项与参数
-d:动态刷新时间间隔
-b:以批次方式执行,与-n连用
-n:执行次数
-p:查看单个进程信息
在top 执行过程中可以使用的命令
?:显示帮助文档
P:以CPU使用资源排序
M: 以mem使用资源排序
N: 以PID排序
T: 以TIME+排序
k:给某个PID一个信号
r:给某个PID设置新的Ni值
q:离开
Z|z:设置|取消颜色
B|b:设置|取消关键字加粗
W:将设置信息写入配置文件
n:显示进程数量
c:显示完整的command
u:设置查看某个USER的进程
[tkf@localhost ~]$ top top - 10:08:12 up 55 min, 2 users, load average: 0.01, 0.01, 0.00 Tasks: 162 total, 1 running, 160 sleeping, 0 stopped, 1 zombie Cpu(s): 1.5%us, 0.7%sy, 0.0%ni, 97.7%id, 0.0%wa, 0.2%hi, 0.0%si, 0.0 Mem: 2074908k total, 640268k used, 1434640k free, 41856k buffers Swap: 1020088k total, 0k used, 1020088k free, 387260k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 4784 root 15 0 64580 17m 10m S 5.4 0.9 0:06.63 gnome-terminal 4502 root 16 0 148m 11m 5964 S 0.6 0.6 0:12.18 Xorg
特殊字段说明
us 用户空间占用CPU百分比
sy 内核空间占用CPU百分比
ni 用户进程空间内改变过优先级的进程占用CPU百分比
id 空闲CPU百分比
wa 等待输入输出的CPU时间百分比
hi 硬件中断
si 软件中断
st: 实时
USER:该 process 所属的使用者;
PR :Priority 的简写,程序的优先运行顺序,越小越早被运行;
NI :Nice 的简写,与Priority 有关,也是越小越早被运行;
%CPU:CPU 的使用率;
%MEM:内存的使用率;
TIME+:CPU 使用时间的累加;
语法:pstree[-A|-U] [-up]
选项与参数
-A :各程序树之间的连接以ASCII 字节来连接;
-U :各程序树之间的连接以unicode的字节来连接。在某些终端介面下可能会有错误;
-p :并同时列出每个process 的 PID;
-u :并同时列出每个process 的所属帐号名称。
举例
[tkf@localhost ~]$ pstree -Apu init(1)-+-/usr/bin/sealer(4774) |-acpid(3891) |-atd(4227) |-auditd(3599)-+-audispd(3601)---{audispd}(3602) | `-{auditd}(3600) |-automount(3994)-+-{automount}(3995) | |-{automount}(3996) | |-{automount}(3999) | `-{automount}(4002)
进程的管理就是给进程发送一个信号,告诉进程做什么事情
语法:kill �Csignal PID
killall [-iIe] �Csignal 服务名称
说明 使用kill需要知道PID,killall根据服务发送信号
举例1:给bash进程发送信号1
[root@localhost ~]# kill -1 $(ps aux |awk '{print $11 "" $2}'|grep '^bash'|awk '{print $2}')
举例2:给bash这个服务对应的进程发送信号1
[root@localhost ~]# killall -i -1 bash
Kill bash(10202) ? (y/N)
进程的优先级相关的只要是PRI与NI这两个值, 数值越小优先级越高,PRI是系统内核设置的,用户无法设置,用户只能是指NI值来改变进程的优先级
进程的优先级=PRI+NI
在执行命令时给予新的NI值:
语法:nice �Cn 数值 命令
数值的范围从-20~19
设置以及启动的进程
语法:renice数值 PID
举例:
[root@localhost ~]# nice -n 4 vim & [1] 11467 [root@localhost ~]# ps -l|grep 'vim' F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 T 0 11467 10202 0 81 4 - 2525 finish pts/1 00:00:00 vim [root@localhost ~]# renice -6 $(ps -l|grep 'vim'|awk '{print $4}') 11467: old priority 4, new priority -6 [root@localhost ~]# ps -l|grep 'vim' 0 T 0 11467 10202 0 71 -6 - 2525 finish pts/1 00:00:00 vim
我们经常会遇到这种情况,要删除某个文件或卸载某个文件系统,提示我们正在使用,无法被删除,此时我们就需要找到哪些进程正在使用它们,“杀死“这些进程后我们才能删除这些文件
语法:fuser[-umv] [-ki -signal] file/dir
选项与参数:
-u:列出user
-m:会查询后面文件所在的文件系统
-v:列出详细命令
-k:找出使用该文件PID并试图发送SIGKILL这个信号给这个进程
-i:与-k连用,发送信号之前询问用户
举例
[root@localhost tmp]# tar -jtv -f ./etc.tar.bz2 > ./newfile.txt = >按下 ctrl+z 工作在后台暂停 [1]+ Stopped tar -jtv -f ./etc.tar.bz2 > ./newfile.txt [root@localhost tmp]# fuser -uv ./etc.tar.bz2 USER PID ACCESS COMMAND ./etc.tar.bz2: root 11822 f.... (root)bzip2 = >这个文件正在被11822这个进程所使用
语法:lsof [-aUu][+d]
选项与参数:
-a :多项数据需要同时成立才显示出结果时
-U :仅列出 Unixlike 系统的 socket 文件类型;
-u :后面接 username,列出该使用者相关程序所开启的文件;
+d :后面接目录,找出某个目录底下已经被开启的文件
举例:查看tar对应经常所打开的文件
[root@localhost tmp]# lsof |grep '^tar' COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME tar 11821 root cwd DIR 8,2 4096 745569 /tmp tar 11821 root rtd DIR 8,2 4096 2 / tar 11821 root txt REG 8,2 229652 1199406 /bin/tar …….. tar 11821 root 2u CHR 136,1 0t0 3 /dev/pts/1 tar 11821 root 3r FIFO 0,6 0t0 38124 pipe
语法:pidof [-sx] 程序名
选项与参数:
-s:仅列出一个PID
-x:列出程序所对应进程的父进程的PID
举例:
[root@localhost tmp]# ps aux |grep $(pidoftar)|grep -v 'grep'
root 11821 0.0 0.0 4880 944 pts/1 T< 13:09 0:00 tar -jtv -f./etc.tar.bz2