进程管理

进程管理

什么是进程 (process)


一个程序被加载到内存当中运作,那么在内存内的那个数据就被称为进程(process)。在Linux系统中触发任何一个事件时,系统都会将他定义成为一个进程,并且给予这个进程一个 ID ,称为 PID,同时依据启发这个进程的用户与相关属性关系,给予这个 PID 一组有效的权限设定。

进程与程序 (process & program)


执行一个程序或指令就可以触发一个事件而取得一个 PID,不同的使用者身份执行这个 program 时,系统给予的权限也都不相同。由这个进程衍生出来的其他进程在一般状态下,也会沿用这个进程的相关权限。

  • 程序 (program):通常为 binary program ,放置在储存媒体中 (如硬盘、光盘、软盘、磁带等), 为实体文 件的型态存在
  • 进程 (process):程序被触发后,执行者的权限与属性、程序的程序代码与所需数据等都会被加载内存中, 操 作系统并给予这个内存内的单元一个标识符 (PID),可以说,进程就是一个正在运作中的程序

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

系统或网络服务是常驻在内存的进程,此这些常驻程序就会被我们称为:服务 (daemon),例如 crond,httpd等,最后的 d 就是代表 daemon 。

工作管理 (job control)


工作管理 (job control) 是用在 bash 环境下的,也就是说:当我们登入系统取得 bash shell 之 后,在单一终端机接口下同时进行多个工作的行为管理。 例如 背景下执行命令 cp file1 file2 & 之后在执行其他命令。

什么是工作管理


进行工作管理的行为中, 每个工作都是目前 bash 的子进程,亦即彼此之间是有相关性的。 我们无法以 job control 的方式由 tty1 的环境去管理 tty2 的 bash。

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

job control 的管理


  • bash 只能够管理自己的工作而不能管理其他 bash 的工作,所以即使你是 root 也不能够将别人的 bash 底下的 job 给他拿过来执行。

  • 利用 & 可以将某些工作直接丢到背景环境中执行,让我们可以继续操作前景的工作。 例:tar -zpcvf /tmp/etc.tar.gz /etc &

  • [ctrl - z] 可以暂停当前工作并将其扔到背景中,比如 正在使用 vim ,却发现我有个文件不知道放在哪里,需要到 bash 环境下进行搜寻,就可以使用 [ctrl - z]。

  • 使用 jobs 命令查看背景中的工作,命令格式如下:

[root@study ~]# jobs [-lrs] 
选项与参数: 
-l  :除了列出 job number 与指令串之外,同时列出 PID 的号码; 
-r  :仅列出正在背景 run 的工作; 
-s  :仅列出正在背景当中暂停 (stop) 的工作。 

使用该命令后,会发现有 + 和 - , + 代表最近被放到背景的工作号码, - 代表最近最后第二个被放置到背景中的工作号码。 而超过最后第三个以后的工作,就不会有 +/- 符号,执行 fg 命令, 那个带 + 的工作就会在前景中处理。

  • 将背景工作拿到前景来处理:fg ,命令格式:fg %jobnumber

  • 让工作在背景下的状态变成运作中: bg ,使用 [ctrl - z]之后的命令为暂停状态,使用 bg %jobnumber 让其在背景下 running。

  • 管理背景当中的工作: kill ,命令格式如下:

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

-9 这个 signal 通常是用在『强制删除一个不正常的工作』时所使用的, -15 则是以正常步骤结束一项工作(15 也是默认值)。

进程管理


注意的是:进程管理是管理所系统上所有的的进程,而工作管理(job control)仅管理具体某一个 shell 下的进程。

进程的观察


主要命令有 pstoppstree

ps 将某个时间点的进程运作情况撷取下来, 命令格式:

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

常用的是 ps -l 只能查阅自己 bash 进程的和 ps aux 查阅所有系统运作的进程。 ps aux 没有那个减号 (-) 。

[root@study ~]# ps -l 
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD 
4 S     0 14830 13970  0  80   0 - 52686 poll_s pts/0    00:00:00 sudo 
4 S     0 14835 14830  0  80   0 - 50511 wait   pts/0    00:00:00 su 
4 S     0 14836 14835  0  80   0 - 29035 wait   pts/0    00:00:00 bash 

相关解释:

  • 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 执行
  • ADDR/SZ/WCHAN:都与内存有关,ADDR 是 kernel function,指出该进程在内存的哪个部分,如果是个 running 的进程,一般就会显示『 - 』 / SZ 代表此进程用掉多少内存 / WCHAN 表示目前进程是否运作中, 同样的,若为 - 表示正在运作中
  • TTY:登入者的终端机位置,若为远程登录则使用动态终端接口 (pts/n)
  • TIME:使用掉的 CPU 时间
  • CMD:就是 command 的缩写,造成此进程的触发程序之指令为何

top 动态观察进程的变化,相对于 ps 是撷取一个时间点的进程状态, top 则可以持续侦测进程运作的状态 ,命令格式:

[root@study ~]# top [-d 数字] | top [-bnp] 
选项与参数: 
-d  :后面可以接秒数,就是整个进程画面更新的秒数。预设是 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 软件的按键。 

一般用于找出最损耗 CPU 资源的那个进程。

pstree 命令用于查看进程之间的相关性,命令格式:

[root@study ~]# pstree [-A|U] [-up] 
选项与参数: 
-A  :各进程树之间的连接以 ASCII 字符来连接; 
-U  :各进程树之间的连接以万国码的字符来连接。在某些终端接口下可能会有错误; 
-p  :并同时列出每个 process 的 PID; 
-u  :并同时列出每个 process 的所属账号名称。 

pstree 的输出可以知道所有的进程都是依附在 systemd 这支进程底下,这支进程的 PID 是一号,因为他是由 Linux 核心所主动呼叫的第一支程序,重新启动 systemd 就是 reboot。

进程的管理


通过给予进程一个信号 (signal) 去管理进程,常用信号:

代号 名称 内容
1 SIGHUP 启动被终止的进程,可让该 PID 重新读取自己的配置文件,类似重新启动
9 SIGKILL 代表强制中断一个进程的进行,如果该进程进行到一半, 那么尚未完成的部分可能会有半产品产生,类似 vim 会有 .filename.swp 保留下来
15 SIGTERM 以正常的结束进程来终止该进程。由于是正常的终止, 所以后续的动作会将他完成。不过,如 果该进程已经发生问题,就是无法使用正常的方法终止时, 输入这个 signal 也是没有用的

命令格式 : kill -signal PID ,kill 可以帮我们将这个 signal 传送给某个工作 (%jobnumber) 或者是某个 PID (直接输入数字)。 kill 后面直接加数字与加上 %number 的情况是不同的。

命令格式 : killall -signal 指令名称 ,例 : killall -9 httpd

系统资源的观察


free :观察内存使用情况

[root@study ~]# free [-b|-k|-m|-g|-h] [-t] [-s N -c N] 
选项与参数: 
-b  :直接输入 free 时,显示的单位是 Kbytes,我们可以使用 b(bytes), m(Mbytes), k(Kbytes), 及 g(Gbytes) 来显示单位。也可以直接让系统自己指定单位 (-h) 
-t  :total, 在输出的最终结果,显示物理内存与 swap 的总量。 
-s  :可以让系统每几秒钟输出一次,不间断的一直输出的意思 
-c  :与 -s 同时处理,让 free 列出几次的意思

uname :查阅系统与核心相关信息,命令格式:

[root@study ~]# uname [-asrmpi] 
选项与参数: 
-a  :所有系统相关的信息,包括底下的数据都会被列出来; 
-s  :系统核心名称 
-r  :核心的版本 
-m  :本系统的硬件名称,例如 i686 或 x86_64 等; 
-p  :CPU 的类型,与 -m 类似,只是显示的是 CPU 的类型! 
-i  :硬件的平台 (ix86) 

dmesg :分析核心产生的信息,系统在开机的时候,核心会去侦测系统的硬件,产生的信息可以用这个命令查看,数据较多一般配合 grep 使用 。

特殊文件与进程


查询整个系统的 SUID/SGID 的文件,使用 find / -perm /6000

/proc/* 代表的意义


进程都是在内存当中,内存当中的数据又都是写入到 /proc/ 中,的各个进程的 PID 都是以目录的型态存在于 /proc 当中。 比如,开机执行的第一支程序 systemd 的 PID 是 1 , 这个 PID 的所有相关信息都写入在 /proc/1/ 中。里边较重要的有:

文件/目录名 文件/目录内容
/proc/filesystems 目前系统已经加载的文件系统
/proc/cpuinfo 本机的 CPU 的相关信息,包含频率、类型与运算功能
/proc/cmdline 加载 kernel 时所下达的相关指令与参数
/proc/modules Linux 已经加载的模块列表,也可以想成是驱动程序
/proc/mounts 系统已经挂载的数据,就是用 mount 这个指令呼叫出来的数据
/proc/partitions 使用 fdisk -l 会出现目前所有的 partition的数据
/proc/version 核心的版本,就是用 uname -a 显示的内容

查询已开启文件或已执行进程开启之文件


fuser : 由文件系统找出正在使用该文件的进程,命令格式:

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

其中 -m 的英语解释为 All processes accessing files on that file system are listed 。 fuser -umv /rootfuser -uv /root/ 输出相同。

lsof :列出被进程所开启的文件名,命令格式:

[root@study ~]# lsof [-aUu] [+d] 
选项与参数: 
-a  :多项数据需要『同时成立』才显示出结果时! 
-U  :仅列出 Unix like 系统的 socket 文件类型; 
-u  :后面接 username,列出该使用者相关进程所开启的文件; 
+d  :后面接目录,亦即找出某个目录底下已经被开启的文件!
# 不加参数列出目前系统上面所有已经被开启的文件与装置

pidof :找出某支正在执行的程序的 PID,命令格式:

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

范例: 列出目前系统上面 systemd 的 PID: pidof systemd




发表评论

评论列表,共 0 条评论

    暂无评论