成都网站建设设计

将想法与焦点和您一起共享

Linux进程管理

博文结构
什么是程序
工作管理
程序管理

目前创新互联已为上千多家的企业提供了网站建设、域名、网站空间绵阳服务器托管、企业网站设计、掇刀网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

一.什么是程序

1.在 Linux 系统当中: “ 触发任何一个事件时,系统都会将他定义成为一个程序,并且给予这个程序一个 ID ,称为 PID ,同时依据启发这个程序的使用者与相关属性关系,给予这个 PID 一组有效的权限设置。

2.程序与进程 ( process & program )

执行一个程序或指令 ” 就可以触发一个事件而取得一个 PID 啰!我们说过,系统应该是仅认识 binary file 的,那么当我们要让系统工作的时候,当然就是需要启动一个 binary file ,那个 binary file 就是程序 ( program )

Linux进程管理

如上图所示,程序一般是放置在实体磁盘中,然后通过使用者的执行来触发。触发后会载入到内存中成为一个个体,那就是程序。 为了操作系统可管理这个程序,因此程序有给予执行者的权限 / 属性等参数,并包括程序所需要的指令码与数据或文件数据等, 最后再给予一个 PID 。系统就是通过这个 PID 来判断该 process 是否具有权限进行工作的

  • 程序 ( program ):通常为 binary program ,放置在储存媒体中 (如硬盘、光盘、软盘、磁带等), 为实体文件的型态存在;

  • 进程 ( process ):程序被触发后,执行者的权限与属性、程序的程序码与所需数据等都会被载入内存中, 操作系统并给予这个内存内的单元一个识别码 ( PID ),可以说,进程就是一个正在运行中的程序。

  • 子程序与父程序:程序彼此之间是有相关性的!以上面的图示来看,连续执行两个 bash 后,第二个 bash的父程序就是前一个 bash 。因为每个程序都有一个 PID ,那某个程序的父程序该如何判断?就通过 Parent PID( PPID )来判断即可。
    Linux进程管理

  • fork and exec :程序调用的流程
    其实子程序与父程序之间的关系还挺复杂的,最大的复杂点在于程序互相之间的调用。在 Linux 的程序调用通常称为 fork-and-exec 的流程程序都会借由父程序以复制 ( fork )的方式产生一个一模一样的子程序, 然后被复制出来的子程序再以 exec的方式来执行实际要进行的程序,最终就成为一个子程序的存在。

如图:

Linux进程管理

(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://chengdu.cdxwcx.cn/article/ppgghh.html