程序管理

1. 程序和进程

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

程序就是硬盘上的二进制文件,

程序被触发后,执行者的权限与属性、程序的程序码与所需资料等都会被载入记忆体中, 作业系统并给予这个记忆体内的单元一个识别码 (PID),可以说,进程就是一个正在运作中的程序

上图中的程式即程序,程序即进程。

2.子进程与父进程

 

上图中程序即进程,进程有一个PPID属性,就是父进程的PID

将有问题的进程关闭了,怎么过一阵子他又自动的产生? 而且新产生的那个进程的 PID 与原先的还不一样,这是怎么回事呢,不要怀疑,如果不是crontab 工作排程的影响,肯定有一支父进程存在,所以你杀掉子进程后, 父进程就会主动再生一支!那怎么办?正所谓这:‘擒贼先擒王’,找出那支父进程,然后将他删除就对啦!

 

fork and exec:进程呼叫的流程

如上图所示,系统先以 fork 的方式复制一个与父程序相同的暂存进程,这个进程与父进程唯一的差别就是 PID 不同! 但是这个暂存进程还会多一个 PPID 的参数,PPID 如前所述,就是父进程的进程识别码啦!然后(2)暂存进程开始以 exec 的方式载入实际要执行的进程,以上述图示来讲,新的进程名称为 qqq ,最终子进程的程式码就会变成 qqq 了!

常驻内存的服务:常驻在内存中的进程通常都是负责一些系统所提供的功能以服务使用者各项任务,因此这些常驻程序就会被我们称为:服务 (daemon)。系统的服务非常的多, 不过主要大致分成系统本身所需要的服务,例如刚刚提到的 crond 及 atd ,还有 syslog 等等的。还有一些则是负责网路连线的服务,例如 Apache, named, postfix, vsftpd... 等等的。这些网路服务比较有趣的地方,在于这些程式被执行后,他会启动一个可以负责网络监听的端口 (port) ,以提供外部用户端 (client) 的连线要求。

3. 工作管理

 

要进行 bash 的 job control 必须要注意到的限制是:

  • 这些工作所触发的进程必须来自于你 shell 的子进程(只管理自己的 bash);
  • 前景:你可以控制与下达指令的这个环境称为前景的工作 (foreground);
  • 背景:可以自行运作的工作,你无法使用 [ctrl]+c 终止他,可使用 bg/fg 呼叫该工作;
  • 背景中‘执行’的进程不能等待 terminal/shell 的输入(input)

 

 

1.直接将指令丢到背景中‘执行’的 &

  
  
  
  
  1. [root@www ~]# tar -zpcf /tmp/etc.tar.gz /etc & 
  2. [1] 8400  <== [job number] PID  
  3. [root@www ~]# tar: Removing leading `/' from member names  
  4. # 在中括号内的号码为工作号码 (job number),该号码与 bash 的控制有关。 
  5. # 后续的 8400 则是这个工作在系统中的 PID。至于后续出现的资料是 tar 执行的资料流, 
  6. # 由于我们没有加上资料流重导向,所以会影响画面!不过不会影响前景的操作喔! 

当指令完成后,会有输出直接输出,如果想把stdout和stderr输出到指定位置,需要用到转向:tar -zpcvf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1 &

2.将‘目前’的工作丢到背景中‘暂停’:[ctrl]-z

3.观察目前的背景工作状态: jobs

  
  
  
  
  1. [root@www ~]# jobs [-lrs] 
  2. 选项与参数: 
  3. -l  :除了列出 job number 与指令串之外,同时列出 PID 的号码; 
  4. -r  :仅列出正在背景 run 的工作; 
  5. -s  :仅列出正在背景当中暂停 (stop) 的工作。 
  6.  
  7. 范例一:观察目前的 bash 当中,所有的工作,与对应的 PID 
  8. [root@www ~]# jobs -l 
  9. [1]- 10314 Stopped                 vim ~/.bashrc 
  10. [2]+ 10833 Stopped                 find / -print 

4.将背景工作拿到前景来处理:fg

  
  
  
  
  1. [root@www ~]# fg %jobnumber 
  2. 选项与参数: 
  3. %jobnumber :jobnumber 为工作号码(数字)。注意,那个 % 是可有可无的! 

5.让工作在背景下的状态变成运作中: bg

可以让暂停的工作在背景中执行

6.管理背景当中的工作: kill

  
  
  
  
  1. [root@www ~]# kill -signal %jobnumber (PID)
  2. [root@www ~]# kill -l 
  3. 选项与参数: 
  4. -l  :这个是 L 的小写,列出目前 kill 能够使用的讯号 (signal) 有哪些? 
  5. signal :代表给予后面接的那个工作什么样的指示��!用 man 7 signal 可知: 
  6.   -1 :重新读取一次参数的设定档 (类似 reload); 
  7.   -2 :代表与由键盘输入 [ctrl]-c 同样的动作; 
  8.   -9 :立刻强制删除一个工作; 
  9.   -15:以正常的程序方式终止一项工作。与 -9 是不一样的。 

-9 这个 signal 通常是用在‘强制删除一个不正常的工作’时所使用的, -15 则是以正常步骤结束一项工作(15也是预设值),两者之间并不相同呦!举上面的例子来说, 我用 vi 的时候,不是会产生一个 .filename.swp 的档案吗? 那么,当使用 -15 这个 signal 时, vi 会尝试以正常的步骤来结束掉该 vi 的工作, 所以 .filename.swp 会主动的被移除。但若是使用 -9 这个 signal 时,由于该 vi 工作会被强制移除掉,因此, .filename.swp 就会继续存在档案系统当中。

 

4.离线管理问题

如果你是以远端连线方式连接到你的 Linux 主机,并且将工作以 & 的方式放到背景去, 请问,在工作尚未结束的情况下你离线了,该工作还会继续进行吗?答案是‘否’!不会继续进行,而是会被中断掉。

可以使用at,也可以使用nohup

  
  
  
  
  1. [root@www ~]# nohup [指令与参数]   <==在终端机前景中工作 
  2. [root@www ~]# nohup [指令与参数] & <==在终端机背景中工作 

 

5.进程管理

1.程序的观察

ps :将某个时间点的程序运作情况撷取下来

  
  
  
  
  1. [root@www ~]# ps aux  <==观察系统所有的程序资料 
  2. [root@www ~]# ps -lA  <==也是能够观察所有系统的资料 
  3. [root@www ~]# ps axjf <==连同部分程序树状态 
  4. 选项与参数: 
  5. -A  :所有的 process 均显示出来,与 -e 具有同样的效用; 
  6. -a  :不与 terminal 有关的所有 process ; 
  7. -u  :有效使用者 (effective user) 相关的 process ; 
  8. x   :通常与 a 这个参数一起使用,可列出较完整资讯。 
  9. 输出格式规划: 
  10. l   :较长、较详细的将该 PID 的的资讯列出; 
  11. j   :工作的格式 (jobs format) 
  12. -f  :做一个更为完整的输出。 

仅观察自己的 bash 相关程序: ps -l

  
  
  
  
  1. 范例一:将目前属于您自己这次登入的 PID 与相关资讯列示出来(只与自己的 bash 有关) 
  2. [root@www ~]# ps -l 
  3. F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD 
  4. 4 S     0 13639 13637  0  75   0 -  1287 wait   pts/1    00:00:00 bash 
  5. 4 R     0 13700 13639  0  77   0 -  1101 -      pts/1    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):僵尸状态,程序已经终止但却无法被移除至记忆体外。

 

僵尸(zombie):

通常,造成僵尸进程的成因是因为该进程应该已经执行完毕,或者是因故应该要终止了, 但是该进程的父程序却无法完整的将该进程结束掉,而造成那个进程一直存在记忆体当中。 如果你发现在某个进程的 CMD 后面还接上 <defunct> 时,就代表该程序是僵尸进程

 

 

top:动态观察程序的变化

  
  
  
  
  1. [root@www ~]# top [-d 数字] | top [-bnp] 
  2. 选项与参数: 
  3. -d  :后面可以接秒数,就是整个程序画面更新的秒数。预设是 5 秒; 
  4. -b  :以批次的方式执行 top ,还有更多的参数可以使用喔! 
  5.       通常会搭配资料流重导向来将批次的结果输出成为档案。 
  6. -n  :与 -b 搭配,意义是,需要进行几次 top 的输出结果。 
  7. -p  :指定某些个 PID 来进行观察监测而已。 
  8. 在 top 执行过程当中可以使用的按键指令: 
  9.     ? :显示在 top 当中可以输入的按键指令; 
  10.     P :以 CPU 的使用资源排序显示; 
  11.     M :以 Memory 的使用资源排序显示; 
  12.     N :以 PID 来排序喔! 
  13.     T :由该 Process 使用的 CPU 时间累积 (TIME+) 排序。 
  14.     k :给予某个 PID 一个讯号  (signal) 
  15.     r :给予某个 PID 重新制订一个 nice 值。 
  16.     q :离开 top 软体的按键。 

pstree:列出进程树,可以查看进程间的关系

  
  
  
  
  1. [root@www ~]# pstree [-A|U] [-up] 
  2. 选项与参数: 
  3. -A  :各程序树之间的连接以 ASCII 字元来连接; 
  4. -U  :各程序树之间的连接以万国码的字元来连接。在某些终端介面下可能会有错误; 
  5. -p  :并同时列出每个 process 的 PID; 
  6. -u  :并同时列出每个 process 的所属帐号名称。 

2.进程的管理

 signal:给进程传递的信号,有很多种,可以通过kill -l来查看,常见的有:

1  SIGHUP  启动被终止的进程,可让该 PID 重新读取自己的设定档,类似重新启动

2  SIGINT  相当于用键盘输入 [ctrl]-c 来中断一个进程的进行

9  SIGKILL  代表强制中断一个进程的进行,如果该进程进行到一半, 那么尚未完成的部分可能会有‘半产品’产生,类似 vim会有 .filename.swp 保留下来。

15  SIGTERM  以正常的结束进程来终止该进程。由于是正常的终止,所以后续的动作会将他完成。不过,如果该进程已经发生问题,就是无法使用正常的方法终止时, 输入这个 signal 也是没有用的。

17  SIGSTOP  相当于用键盘输入 [ctrl]-z 来暂停一个进程的进行 

 

kill -signal PID

 

killall -signal 指令名称

  
  
  
  
  1. [root@www ~]# killall [-iIe] [command name] 
  2. 选项与参数: 
  3. -i  :interactive 的意思,互动式的,若需要删除时,会出现提示字元给使用者; 
  4. -e  :exact 的意思,表示‘后面接的 command name 要一致’,但整个完整的指令 
  5.       不能超过 15 个字元。 
  6. -I  :指令名称(可能含参数)忽略大小写。 

要删除某个进程,我们可以使用 PID 或者是启动该进程的指令名称, 而如果要删除某个服务呢?呵呵!最简单的方法就是利用 killall , 因为他可以将系统当中所有以某个指令名称启动的进程全部删除。

 

3.关于程序的执行顺序

Priority 与 Nice 值:

 

PRI(new) = PRI(old) + nice

不过你要特别留意到,如果原本的 PRI 是 50 ,并不是我们给予一个 nice = 5 ,就会让 PRI 变成 55 喔! 因为 PRI 是系统‘动态’决定的,所以,虽然 nice 值是可以影响 PRI ,不过, 最终的 PRI 仍是要经过系统分析后才会决定的。另外, nice 值是有正负的喔,而既然 PRI 越小越早被执行, 所以,当 nice 值为负值时,那么该程序就会降低 PRI 值,亦即会变的较优先被处理。此外,你必须要留意到:

  • nice 值可调整的范围为 -20 ~ 19 ;
  • root 可随意调整自己或他人程序的 Nice 值,且范围为 -20 ~ 19 ;
  • 一般使用者仅可调整自己程序的 Nice 值,且范围仅为 0 ~ 19 (避免一般用户抢占系统资源);
  • 一般使用者仅可将 nice 值越调越高,例如本来 nice 为 5 ,则未来仅能调整到大于 5;

 

如何给予某个程序 nice 值呢?有两种方式,分别是:

  • 一开始执行程式就立即给予一个特定的 nice 值:用 nice 指令;
  
  
  
  
  1. [root@www ~]# nice [-n 数字] command 
  2. 选项与参数: 
  3. -n  :后面接一个数值,数值的范围 -20 ~ 19。 
  4. 范例一:用 root 给一个 nice 值为 -5 ,用于执行 vi ,并观察该程序! 
  5. [root@www ~]# nice -n -5 vi & 
  • 调整某个已经存在的 PID 的 nice 值:用 renice 指令。
  
  
  
  
  1. [root@www ~]# renice [number] PID 
  2. 选项与参数: 
  3. PID :某个程序的 ID 啊! 

 

4.系统资源的观察

free :观察内存使用情况

  
  
  
  
  1. [root@www ~]# free [-b|-k|-m|-g] [-t] 
  2. 选项与参数: 
  3. -b  :直接输入 free 时,显示的单位是 Kbytes,我们可以使用 b(bytes), m(Mbytes) 
  4.       k(Kbytes), 及 g(Gbytes) 来显示单位喔! 
  5. -t  :在输出的最终结果,显示内存与 swap 的总量。 

linux为了读取效率,会存放cach在内存中,所以即使没有什么工作,内存也基本上都会被耗完。

uname:查阅系统与核心相关资讯

  
  
  
  
  1. [root@www ~]# uname [-asrmpi] 
  2. 选项与参数: 
  3. -a  :所有系统相关的资讯,包括底下的资料都会被列出来; 
  4. -s  :系统核心名称 
  5. -r  :核心的版本 
  6. -m  :本系统的硬体名称,例如 i686 或 x86_64 等; 
  7. -p  :CPU 的类型,与 -m 类似,只是显示的是 CPU 的类型! 
  8. -i  :硬体的平台 (ix86) 

uptime:观察系统启动时间与工作负载(1,5,15分钟平均负载)

netstat :追踪网络或端口

  
  
  
  
  1. [root@www ~]# netstat -[atunlp] 
  2. 选项与参数: 
  3. -a  :将目前系统上所有的连线、监听、Socket 资料都列出来 
  4. -t  :列出 tcp 网路封包的资料 
  5. -u  :列出 udp 网路封包的资料 
  6. -n  :不以程序的服务名称,以端口号 (port number) 来显示; 
  7. -l  :列出目前正在网路监听 (listen) 的服务; 
  8. -p  :列出该网路服务的程序 PID  

dmesg :分析核心产生的讯息

一些硬件相关信息

vmstat :侦测系统资源变化

  
  
  
  
  1. [root@www ~]# vmstat [-a] [延迟 [总计侦测次数]] <==CPU/记忆体等资讯 
  2. [root@www ~]# vmstat [-fs]                      <==记忆体相关 
  3. [root@www ~]# vmstat [-S 单位]                  <==设定显示数据的单位 
  4. [root@www ~]# vmstat [-d]                       <==与磁碟有关 
  5. [root@www ~]# vmstat [-p 分割槽]                <==与磁碟有关 
  6. 选项与参数: 
  7. -a  :使用 inactive/active(活跃与否) 取代 buffer/cache 的记忆体输出资讯; 
  8. -f  :开机到目前为止,系统复制 (fork) 的程序数; 
  9. -s  :将一些事件 (开机至目前为止) 导致的记忆体变化情况列表说明; 
  10. -S  :后面可以接单位,让显示的资料有单位。例如 K/M 取代 bytes 的容量; 
  11. -d  :列出磁碟的读写总量统计表 
  12. -p  :后面列出分割槽,可显示该分割槽的读写总量统计表 

 

6.特殊档案与进程

具有 SUID/SGID 权限的指令执行状态

其实就是在进程产生时,进程权限部分是程序拥有者。只在程序运行时有效

 

/proc/* 代表的意义

主机上面的各个程序的 PID 都是以目录的型态存在于 /proc 当中,比如说/proc/1这个目录,里面有很多资料,代表该进程的运行情况。

/proc下面还有很多代表linux系统运行状况的文件。

 

7.查询已打开文件或已执行进程打开的文件

fuser:由文件(或文件系统)找出正在使用该文件的进程

  
  
  
  
  1. [root@www ~]# fuser [-umv] [-k [i] [-signal]] file/dir 
  2. 选项与参数: 
  3. -u  :除了程序的 PID 之外,同时列出该程序的拥有者; 
  4. -m  :后面接的那个档名会主动的上提到该档案系统的最顶层,对 umount 不成功很有效! 
  5. -v  :可以列出每个档案与程序还有指令的完整相关性! 
  6. -k  :找出使用该档案/目录的 PID ,并试图以 SIGKILL 这个讯号给予该 PID; 
  7. -i  :必须与 -k 配合,在删除 PID 之前会先询问使用者意愿! 
  8. -signal:例如 -1 -15 等等,若不加的话,预设是 SIGKILL (-9) ��! 

lsof :列出被进程所开启的we名

  
  
  
  
  1. [root@www ~]# lsof [-aUu] [+d] 
  2. 选项与参数: 
  3. -a  :多项资料需要‘同时成立’才显示出结果时! 
  4. -U  :仅列出 Unix like 系统的 socket 档案类型; 
  5. -u  :后面接 username,列出该使用者相关程序所开启的档案; 
  6. +d  :后面接目录,亦即找出某个目录底下已经被开启的档案! 

若想找出由root打开的跟bash有关的文件:lsof -u root | grep bash

pidof :找出某支正在执行的程式的 PID

  
  
  
  
  1. [root@www ~]# pidof [-sx] program_name 
  2. 选项与参数: 
  3. -s  :仅列出一个 PID 而不列出所有的 PID 
  4. -x  :同时列出该 program name 可能的 PPID 那个程序的 PID 

 

你可能感兴趣的:(职场,进程,程序,休闲)