Linux进程管理
博文结构
什么是程序
工作管理
程序管理目前创新互联已为上千多家的企业提供了网站建设、域名、网站空间、绵阳服务器托管、企业网站设计、掇刀网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
一.什么是程序
1.在 Linux 系统当中: “ 触发任何一个事件时,系统都会将他定义成为一个程序,并且给予这个程序一个 ID ,称为 PID ,同时依据启发这个程序的使用者与相关属性关系,给予这个 PID 一组有效的权限设置。
2.程序与进程 ( process & program )
执行一个程序或指令 ” 就可以触发一个事件而取得一个 PID 啰!我们说过,系统应该是仅认识 binary file 的,那么当我们要让系统工作的时候,当然就是需要启动一个 binary file ,那个 binary file 就是程序 ( program )
如上图所示,程序一般是放置在实体磁盘中,然后通过使用者的执行来触发。触发后会载入到内存中成为一个个体,那就是程序。 为了操作系统可管理这个程序,因此程序有给予执行者的权限 / 属性等参数,并包括程序所需要的指令码与数据或文件数据等, 最后再给予一个 PID 。系统就是通过这个 PID 来判断该 process 是否具有权限进行工作的
程序 ( program ):通常为 binary program ,放置在储存媒体中 (如硬盘、光盘、软盘、磁带等), 为实体文件的型态存在;
进程 ( process ):程序被触发后,执行者的权限与属性、程序的程序码与所需数据等都会被载入内存中, 操作系统并给予这个内存内的单元一个识别码 ( PID ),可以说,进程就是一个正在运行中的程序。
子程序与父程序:程序彼此之间是有相关性的!以上面的图示来看,连续执行两个 bash 后,第二个 bash的父程序就是前一个 bash 。因为每个程序都有一个 PID ,那某个程序的父程序该如何判断?就通过 Parent PID( PPID )来判断即可。
- fork and exec :程序调用的流程
其实子程序与父程序之间的关系还挺复杂的,最大的复杂点在于程序互相之间的调用。在 Linux 的程序调用通常称为 fork-and-exec 的流程程序都会借由父程序以复制 ( fork )的方式产生一个一模一样的子程序, 然后被复制出来的子程序再以 exec的方式来执行实际要进行的程序,最终就成为一个子程序的存在。
如图:
(1 )系统先以 fork 的方式复制一个与父程序相同的暂存程序,这个程序与父程序唯一的差别就是 PID 不同! 但是这个暂存程序还会多一个 PPID 的参数,PPID 如前所述,就是父程序的程序识别码啦!然后
( 2 )暂存程序开始以 exec 的方式载入实际要执行的程序,以上述图示来讲,新的程序名称为 qqq ,最终子程序的程序码就会变成 qqq 了!
二.工作管理
这个工作管理 ( job control ) 是用在 bash 环境下的,也就是说: “ 当我们登陆系统取得 bash shell 之后,在单一终端机接口下同时进行多个工作的行为管理 ” 。举例来说,我们在登陆 bash 后, 想要一边复制文件、一边进行数据搜寻、一边进行编译,还可以一边进行 vim 程序撰写! 当然我们可以重复登陆那六个命令行的终端机环境中
- 要进行 bash 的工作管理必须要注意到的限制是:
这些工作所触发的程序必须来自于你 shell 的子程序(只管理自己的 bash );
前景:你可以控制与下达指令的这个环境称为前景的工作 ( foreground );
背景:可以自行运行的工作,你无法使用 [ctrl]+c 终止他,可使用 bg/fg 调用该工作;
背景中 “ 执行 ” 的程序不能等待 terminal(终端)/shell 的输入( input )
例如:可以隐藏执行程序
[root@localhost ~]# tar -zpcf /tmp/etc.tar.gz /etc/&
[1] 3433 \\PID
- 观察目前的背景工作状态: jobs
[root@localhost ~]# jobs
参数如下:
-l : 除了列出job number与指令串之外,还列出PID
-r : 仅列出正在背景run的工作
- s :仅列出正在背景当中暂停(stop) 的工作
[root@localhost ~]# jobs -l
[1]- 3516 停止 vim aaa
[2]+ 3520 停止 vim abbb
- 将背景工作拿到前景来处理: fg
[root@localhost ~]# fg %1
选项与参数:
%jobnumber : jobnumber为工作号码(数字),注意,那个%是可有可无的
- 让工作在背景下的状态变成运行中: bg
举例:执行如下命令后,立刻丢掉背景去工作
[root@localhost ~]# find / -perm /7000 > /tmp/test.txt \\查询过程中按下ctrl+z暂停
find: ‘/proc/3585/task/3585/fd/6’: 没有那个文件或目录
find: ‘/proc/3585/task/3585/fdinfo/6’: 没有那个文件或目录
find: ‘/proc/3585/fd/6’: 没有那个文件或目录
find: ‘/proc/3585/fdinfo/6’: 没有那个文件或目录
[3]+ 已停止 find / -perm /7000 > /tmp/test.txt
[root@localhost ~]# jobs \\查看一下
[1]- 已停止 vim aaa
[2] 已停止 vim abbb
[3]+ 已停止 find / -perm /7000 > /tmp/test.txt
- 管理背景当中的工作: kill
[root@localhost ~]# kill -signal %jobnumber \\命令格式
[root@localhost ~]# kill -l
选项与参数
-l :这个是L的小写,列出目前kill能够使用的讯号有哪些
signal :代表给与后面接的那个工作什么样的指示
-1 : 重新读取一次参数的配置文件类似(reload)
-2 : 代表与由键盘输入【ctrl】-c同样的动作
-9 : 立刻强制删除一个工作
-15 : 以正常的程序方式终止一项工作,与-9不一样
例如:
[root@localhost ~]# kill -9 %2
[2] 已杀死 vim abbb
- ps :将某个时间点的程序运行情况撷取下来
[root@localhost ~]# ps aux \\观察系统所有的程序数据
[root@localhost ~]# ps -lA \\也是能够观察所有系统数据
[root@localhost ~]# ps axjf \\连同部分程序树状态
选项与参数:
-A :所有的process :均显示出来,与-e具有同样的效用;
-a :不与terminal 有关的所有process ;
-u :有效使用者( effective user)相关的process ;
-x:通常与a这个参数一起使用,可列出较完整信息。
输出长格式规则:
1 :较长、较详细的将该PID的的信息列出;
j :工作的格式( jobs format )
-f:做一个更为完整的输出。0
- 仅观察自己的 bash 相关程序: ps -l
[root@localhost ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 3373 3368 0 80 0 - 29191 wait pts/0 00:00:00 bash
4 T 0 3516 3373 0 80 0 - 37936 signal pts/0 00:00:00 vim
4 T 0 3585 3373 0 80 0 - 30320 signal pts/0 00:00:00 find
0 R 0 3852 3373 0 80 0 - 37233 - pts/0 00:00:00 ps
F :代表这个程序旗标 ( process flags ),说明这个程序的总结权限,常见号码有:
若为 4 表示此程序的权限为 root ;
若为 1 则表示此子程序仅进行复制( fork )而没有实际执行( exec )。
S :代表这个程序的状态 ( STAT ),主要的状态有:
R( Running ):该程序正在运行中;
S( Sleep ):该程序目前正在睡眠状态( idle ),但可以被唤醒( signal )。
D:不可被唤醒的睡眠状态,通常这支程序可能在等待 I/O 的情况( ex> 打印)
T:停止状态( stop ),可能是在工作控制(背景暂停)或除错 ( traced ) 状态;
Z( Zombie ):僵尸状态,程序已经终止但却无法被移除至内存外。
UID/PID/PPID:代表 “ 此程序被该 UID 所拥有 / 程序的 PID 号码 / 此程序的父程序 PID 号码 ”
C:代表 CPU 使用率,单位为百分比;
PRI/NI: Priority/Nice 的缩写,代表此程序被 CPU 所执行的优先顺序,数值越小代表该程序越快被 CPU 执行。详细的 PRI与 NI 将在下一小节说明。
ADDR/SZ/WCHAN :都与内存有关, ADDR 是 kernel function
TTY:登陆者的终端机位置,若为远端登陆则使用动态终端接口 ( pts/n );
TIME:使用掉的 CPU 时间,注意,是此程序实际花费 CPU 运行的时间,而不是系统时间;
CMD:就是 command 的缩写,造成此程序的触发程序之指令为何
- 观察系统所有程序: ps aux
[root@localhost ~]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 125288 3832 ? Ss 21:36 0:01 /usr/lib/systemd/syst
root 2 0.0 0.0 0 0 ? S 21:36 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 21:36 0:00 [ksoftirqd/0]
root 6 0.0 0.0 0 0 ? S 21:36 0:00 [kworker/u256:0]
root 7 0.0 0.0 0 0 ? S 21:36 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 21:36 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? R 21:36 0:00 [rcu_sched]
............................
USER :该 process 属于那个使用者帐号的?
PID :该 process 的程序识别码。
%CPU :该 process 使用掉的 CPU 资源百分比;
%MEM :该 process 所占用的实体内存百分比;
VSZ :该 process 使用掉的虚拟内存量 ( KBytes )
RSS :该 process 占用的固定的内存量 ( KBytes )
TTY :该 process 是在那个终端机上面运行
STAT :该程序目前的状态,状态显示与 ps -l 的 S 旗标相同 ( R/S/T/Z )
START :该 process 被触发启动的时间;
TIME :该 process 实际使用 CPU 运行的时间。
COMMAND :该程序的实际指令
[root@localhost ~]# ps -lA
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 80 0 - 31322 ep_pol ? 00:00:01 systemd
1 S 0 2 0 0 80 0 - 0 kthrea ? 00:00:00 kthreadd
1 S 0 3 2 0 80 0 - 0 smpboo ? 00:00:00 ksoftirqd/0
1 S 0 6 2 0 80 0 - 0 worker ? 00:00:00 kworker/u256:0
..................................
可以发现每个字段与ps -l 的输出情况相同,但显示的程序则包括系统所的程序有
- top :动态观察程序的变化
选项与参数:
-d :后面可以接秒数,就是整个程序画面更新的秒数。默认是5秒;
-b :以批次的方式执行top,还有更多的参数可以使用喔!通常会搭配数据流重响来将批次的结果输出成为文件。
-n:与-b搭配,意义是,需要进行几次top的输出结果。
p :指定某些个PID来进行观察监测而已。在top执行过程当中可以使用的按键指令:
? :示在top 当中可以输入的按键指令;
P :以CPU的使用资源排序显示;
M :以Memory的使用资源排序显示;
N :以PID来排序
T :由该Process使用的CPU时间累积(TIME+) 排序。
k :给予某个PID一个讯号( signa1)
r:给予某个PID重新制订一个nice值。
q。开top软件的按键。
[root@localhost ~]# top -d 2 \\在里面按下r,则会输入东西
top - 22:12:54 up 35 min, 2 users, load average: 0.27, 0.20, 0.14
Tasks: 172 total, 2 running, 168 sleeping, 2 stopped, 0 zombie
%Cpu(s): 12.8 us, 2.1 sy, 0.0 ni, 85.1 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 999936 total, 76540 free, 540976 used, 382420 buff/cache
KiB Swap: 2097148 total, 2094632 free, 2516 used. 233744 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2867 root 20 0 1484940 170296 49456 S 6.5 17.0 0:30.15 gnome-shell
1747 root 20 0 215824 26092 10428 R 4.0 2.6 0:11.07 Xorg
3368 root 20 0 574040 23780 14652 S 2.0 2.4 0:06.29 gnome-terminal-
2833 root 20 0 1094016 24516 15828 S 1.5 2.5 0:00.73 gnome-settings-
2904 root 20 0 574456 8876 5320 S 1.0 0.9 0:01.23 caribou
676 root 20 0 4368 592 496 S 0.5 0.1 0:01.79 rngd
2654 root 20 0 27644 1844 620 S 0.5 0.2 0:00.30 dbus-daemon
2821 root 20 0 201268 3428 2768 S 0.5 0.3 0:00.31 at-spi2-registr
43813 root 20 0 157708 2288 1584 R 0.5 0.2 0:00.03 top
1 root 20 0 125288 3832 2404 S 0.0 0.4 0:01.70 systemd ..........................
top主要分为两个画面,上面的画面为整个系统的资源使用状态,基本上总共有六行,显示的内容依序是:
第一行( top...) :目前的时间,亦即是 10:52:16 那个项目;
开机到目前为止所经过的时间,亦即是 up 1:40, 那个项目;
已经登陆系统的使用者人数,亦即是 2 users, 项目;
系统在 1, 5, 15 分钟的平均工作负载
第二行( Tasks... ):显示的是目前程序的总量与个别程序在什么状态( running, sleeping, stopped, zombie )
第三行( %Cpus... ):显示的是 CPU 的整体负载
6.7% us — 用户空间占用CPU的百分比。
0.4% sy — 内核空间占用CPU的百分比。
0.0% ni — 改变过优先级的进程占用CPU的百分比
92.9% id — 空闲CPU百分比
0.0% wa — IO等待占用CPU的百分比
0.0% hi — 硬中断(Hardware IRQ)占用CPU的百分比
0.0% si — 软中断(Software Interrupts)占用CPU的百分比
0.0% st ---虚拟cpu等待实际cpu的时间百分比
第四行:内存状态
8306544k total — 物理内存总量(8GB)
7775876k used — 使用中的内存总量(7.7GB)
530668k free — 空闲内存总量(530M)
79236k buffers — 缓存的内存量 (79M)
第五行:swap交换分区
2031608k total — 交换区总量(2GB)
2556k used — 使用的交换区总量(2.5M)
2029052k free — 空闲交换区总量(2GB)
4231276k cached — 缓冲的交换区总量(4GB)
第六行:这个是当在 top 程序当中输入指令时,显示状态的地方。
PID :每个 process 的 ID 啦!
USER :该 process 所属的使用者;
PR : Priority 的简写,程序的优先执行顺序,越小越早被执行;
NI : Nice 的简写,与 Priority 有关,也是越小越早被执行;
%CPU : CPU 的使用率;
%MEM :内存的使用率;
TIME+ : CPU 使用时间的累加;
[root@localhost ~]# top -b -n 2 > /tmp/123.txt
将top的信息进行2次,然后将结果输出到/tmp/123.txt文件中
[root@localhost ~]# cat /tmp/123.txt
- pstree
选项与参数:
-A :各程序树之间的连接以ASCII 字符来连接;
-U :各程序树之间的连接以万国码的字符来连接。在某些终端接口下可能会有错误;
P :并同时列出每个process 的PID;
u :并同时列出每个process的所属帐号名称。
文章题目:Linux进程管理
本文URL:http://scyanting.com/article/ppgghh.html