走进Linux_认识你的进程

引:linux服务器上可以跑很多很多的程序,当然也会遇到很多的问题,所以我们需要学会去管理好它。尤其像ps,top这些命令,你一定会很想去了解它吧!

理解进程

什么是进程

进程: 一个程序被加载到内存当中运行,那么在内存中的那个数据就被称为进程。

系统也会给予这个进程一个ID,称为PID。同时触发这个进程的用户与相关属性关系,给予这个PID一组有效的权限设置。

进程与程序

程序和进程概念

  1. 程序:通常为二进制程序,放置在存储媒介中,以物理文件的形式存在。
  2. 进程:程序在触发后,执行者的权限与属性、程序的程序代码与所需数据等都会被加载到内存中,操作系统给予这个内存中的单元一个标识符(PID),可以说,进程就是一个正在运行的程序。

子进程与父进程

举个栗子:当我们登录系统后,会取得一个bash的shell,然后,我们用这个bash提供的接口去执行另一个命令,那些另外执行的命令也会被触发称为PID,那个后来执行命令才产生的PID就是“子进程”,而在我们原本在bash环境下,就称为“父进程”。子进程会具有PPID(父PID)。

fork and exec:过程调用的流程

在Linux的过程调用中通常被称为fork and exec的流程,进程都会父进程以复制(fork)的方式产生一个一模一样的子进程(PID不一样),然后被复制出来的子进程再以exec的方式来执行实际要进行的进程,最终称为一个子进程的存在。

工作管理

什么是工作管理

工作管理: 当我们登录系统取得bash shell之后,在单一终端机下同时进行多个工作的行为管理。

下面是前台和后台定义:

前台: 你可以控制与执行命令的环境

后台: 可以自行运行的工作,你无法用ctrl + c终止它,但是可以用bg/fg调用该工作的环境

要进行bash的工作管理必须要注意的限制是:

  • 这些工作所触发的进程必须要来自你的shell子进程(只管理自己的bash)
  • 后台中“执行”的进程不能等待terminal/shell的输入。

job管理

实际中使用的job控制主要有下面的命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 1. 直接将命令丢到后台中“执行”的 &
tar -zpcf /tmp/tec/tar.gz /etc &
/*
会出现[1](工作好) 13456(进程号)
完成后会输出: [1] 完成 tar -zpcf /tmp/etc.tar.gz /etc */
/*
但是需要注意的是,运行的信息还是会出现在屏幕上,会影响我们正常继续使用,
所以我们需要利用数据流重定向输入到文件中。*/

// 2. 将目前的工作丢到后台中“暂停”:ctrl + z
vim ~/.bashrc 按ctrl+z
/*
会输出 [2]+ 已停止 vim ~/.bashrc */

// 3. 查看目前的后台工作状态:jobs

// 4. 将后台工作拿到前台来处理:fg
fg %2 //拿出刚刚vim的工作

// 5. 让工作在后台下得状态变成运行中:bg
bg %2

// 6. 管理后台当中的工作:kill
kill -signal %jobnumber/PID/命令
/* signal
-1:重新读取一次参数的配置文件
-2:与ctrl + c一样
-9:立刻强制删除一个工作,不会删除过程文件
-15(默认值):以正常的程序方式终止一项工作,会删除过程文件 */

脱机管理

如果你是使用&来放置后台工作,当你断开与终端机的连接(脱机),那么后台工作就会被中断掉。如果我们不想这样就可以使用at或者nohup命令,我们主要讲一下nohup的这个命令,这个命令可以让你在脱机或注销系统后,还能够让工作继续进行。范例如下:

1
2
3
4
5
// 1. 在终端机前台中工作
nohup 命令

// 1. 在终端机后台工作
nohup 命令 &

当你使用这个命令之后,你会发现会出现一个nohup.out文件,这个文件其实就是将原本前台显示的东西重定向到这个文件中。

进程管理

进程的查看

静态的ps

PS:如果man page不好查阅,最好是直接被几个常用的参数。

这个命令是将某个时间点的进程运行情况选取下来,主要的范例如下:

  1. 仅查看自己的bash的相关进程

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    ps -l

    /* 输出列子如下:
    F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
    4 S 0 10573 10567 0 80 0 - 29064 wait pts/0 00:00:00 bash

    含义如下:
    F:程序标识(process flags),说明程序的权限,4代表root,1代表子程序仅能fork不能exec

    S:程序状态(state),主要有R(running)、S(sleep)、D(不可唤醒)、T(stop)、Z(僵尸,命令位会跟<defunct>)

    UID/PID/PPID :PPID指父程序的PID

    C:代表CPU使用率,单位为百分比

    PRI/NI:此程序被CPU执行优先级,数值越小程序优先级越高

    ADDR/SZ/WCHAN:ADDR代表在内存哪个部分,SZ代表用掉多少内存,WCHAN表示程序是否正在运作

    TTY:登陆者的终端机位置,远程登录时为 pts/n

    TIME:使用掉的CPU时间,程序实际花费CPU运作时间

    CMD:触发程序的指令 */
  2. 查看系统所有进程:ps aux

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    ps aux

    /* 输出列子如下:
    USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
    root 1 0.0 0.1 43156 3136 ? Ss 3月10 1:27 /usr/lib/systemd/systemd --swi

    含义如下:
    USER:该进程属于哪个用户账号

    PID :进程ID

    %CPU:该进程使用掉的CPU资源内存百分比

    %MEM:该进程所占用的物理内存百分比

    VSZ:该进程使用掉的虚拟内存量(KB)

    RSS:该进程占用的固定的内存量(KB)

    TTY:登陆者的终端机位置,远程登录时为 pts/n

    STAT:与ps -l的S表示相同

    START:该进程被触发启动的时间

    TIME:程序实际花费CPU运作时间

    CMD:该进程的实际命令 */

动态的top

这个命令可以持续的检测进程运行的状态,主要范例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 1. 每两秒更新一次top,查看整体信息,默认5秒
top -d 2

/* 输出例子:
top - 10:54:10 up 22 days, 19:25, 1 user, load average: 0.13, 0.07, 0.06
Tasks: 69 total, 2 running, 66 sleeping, 1 stopped, 0 zombie
%Cpu(s): 0.5 us, 0.0 sy, 0.0 ni, 99.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1883844 total, 77012 free, 356884 used, 1449948 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 1328820 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1861 root 20 0 608356 12236 1788 S 0.5 0.6 60:48.59 barad_agent

top见界面主要分为两个界面:

上面为整个系统的资源使用状态,基本上总共有六行,显示的内容依次是:
1. 目前的时间,开机到目前为止所经过的时间,已经登录系统的的用户数,系统在1,5,15分钟的平均工作负载
2. 目前进程的总量与各个累呗进程的总量,注意zombie僵尸进程的数量
3. CPU的整体负载,注意wa(I/Owait)
4. 物理内存的使用情况
5. 虚拟内存的使用情况,swap的是用来一定要小
6. 这个是当在top进程中输入命令时显示状态的地方,输入r可修改nice值

下面为每个进程使用资源情况,各个参数含义可参照ps。
*/

进程树pstree

如果想找到进程之间的相关性,这个pstree就能够很好的帮助我们,它会使用线段将相关性进程连接起来,范例如下:

1
2
3
4
5
6
7
8
9
10
11
// 1.列出目前系统上面所有的进程数的相关性
pstree -A
输入如下:
systemd-+-acpid
|-2*[agetty]
|-atd
|-auditd---{auditd}
...

// 2. 在1的基础上,同时显示出PID与users
pstree -Aup

进程的执行顺序

CPU优先处理哪个进程,这就需要考虑到程序的优先执行序(priority)与CPU的调度。具体到值来说就是要考虑到PRI和nice值(之前用top和ps显示过)。PRI值越低代表越优先,不过这个PRI值是由内核动态调整的,具有无法调整,但是Nice值我们可以改变。下面的PRI值改变的公式:

PRI(new) = PRI(old) + nice

下面是关于nice值的使用范例:

1
2
3
4
5
// 1. 在使用命令的时候设置nice值,给nice值为-5去执行vi
nice -n vi &

// 2. 已存在进程的nice重新分配,将PID为18625的进程nice值调整到10
renice 10 18625

系统资源的查看

  1. 查看内存的使用情况,范例如下:

    1
    2
    // 1. 查看目前系统的内存容量
    free -m
  2. 查看系统与内核相关信息,范例如下:

    1
    2
    // 1. 输出系统的基本信息
    uname -a
  3. 查看系统启动时间与内存负载,范例如下:

    1
    uptime
  4. 跟踪网络(很重要),范例如下:

    1
    2
    3
    4
    5
    // 1. 列出目前系统以及新建的网络连接与unix socket状态
    netstat

    // 2. 找出目前系统上已在监听的网络连接机及其PID(很重要)
    netstat -tlnp
  5. 分析内核产生的信息,范例如下:

    1
    2
    3
    4
    5
    // 1. 输出所有的内核开机时的信息
    dmesg | more

    // 2. 查找开机的时候硬盘的相关信息
    dmesg | grep i hd
  6. 检测系统资源变化,范例如下:

    1
    2
    3
    4
    5
    6
    7
    // 1. 统计目前主机CPU状态,每秒一次,共计三次
    vmstat 1 3

    // 2. 系统上面所有磁盘的读写状态
    vmstat -d

    PS:详细的各个字段的含义,大家就自己查询man vmstat好了,习惯就好。

参考

  1. 《鸟哥的Linux私房菜》