3. Linux中的进程管理

159 阅读3分钟

本系列都是是基于RedHat体系的,所以CentOS也可以用,但是Debian系列的可能会有些命令上的出入。

1. 进程

程序是静态的可执行程序,进程是动态的程序。

进程中有:PID、文件、内存地址空间、权限限制、线程、状态。

2. 进程管理

2.1 目标

  • PID/PPID
  • 当前进程的状态
  • 进程名称
  • 内存分配情况
  • CPU使用和已经花费的时间
  • 用户UID,决定进程的特权
# 进程的生命周期

                                 +------[T]-------+                      +------[R]-------+
                                 |    Stopped     |                      |     Running    |
                                 |                |                      |      [User]    |
                                 +----------------+                      +----------------+                     X
        |                          ^            |                          ^            |                       ^
        |                          |            |                          |            |                       |
       fork                     suspend      resume                      syscall     return                    reap
        |                          |            |                          |            |                       |
        V                          |            V                          |            V                       |
+----------------+               +------[R]-------+         run          +------[R]-------+             +------[Z]-------+
|     [new]      |   schedule    |     Runnable   | -------------------> |     Running    |    exit     |     Zoombie    |
|                | ------------> |     [ready]    | <------------------- |     [kernel]   | ----------> |                |
+----------------+               +----------------+  preempt/reschedual  +----------------+             +----------------+
                                         ^                                       |
                                         |                                       |
                                  event or siganl                               wait
                                         |                                       |
                                         |                                       V
                                 +------[K]-------+-------[D]------+------[S]-------+
                                 |    Sleeping    |    Sleeping    |    Sleeping    |
                                 |                |                |                |
                                 +----------------+----------------+----------------+

2.2 ps:process status,静态查看进程

# 用户 PID CPU占用率 内存占用率 占用虚拟内存 占用实际内存 进程运行的终端 进程状态 进程启动时间 累积时间 命令
$ ps aux | head -2
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.3 169024 13164 ?        Ss    2020   0:14 /sbin/init splash

ps: process status

  • a:显示现在终端机下所有的程序
  • u:以用户为主的格式来显示程序状况,详细信息
  • x:不以终端机来区分,显示没有终端的进程,就是tty=?

状态STAT(可以通过man ps可以产看所有的PROCESS STATE CODES)

  • S:Sleeping

  • T:Stopped

  • Z:Zombie

  • R:running

进程排序: ps aux --sort %cpu%cpu可以换成任意一列的名称。

进程的父子关系,杀不死的进程可以通过杀死其父进程来杀死子进程。

$ ps -ef | head -5
# 用户        PID    PPID 标识 启动时间 终端    累积时间 命令
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0  2020 ?        00:00:15 /sbin/init splash
root           2       0  0  2020 ?        00:00:00 [kthreadd]
root           3       2  0  2020 ?        00:00:00 [rcu_gp]
root           4       2  0  2020 ?        00:00:00 [rcu_par_gp]

PPID是同行PID的父进程。而父进程号是0的则是操作系统的进程。

自定义显示字段:

$ ps axo user,pid,ppid,%mem,command | head -3

2.3 top:动态查看进程

$ top
basil@basil-2020:~$ top | head -10 
# 程序名top 系统时间 运行时间        登录用户数  CPU负载        1分钟 5分钟 15分钟
top - 17:40:17 up 9 days,  3:42,  3 users,  load average: 0.31, 0.40, 0.44
# 总进程数           运行数       睡眠数          停止数         僵死数
Tasks: 188 total,   1 running, 186 sleeping,   0 stopped,   1 zombie
# CPU占用比 us用户   sy系统   ni优先级 id空闲     wa等待    hi硬件    si软件   st虚拟机
%Cpu(s):  1.0 us,  1.2 sy,  1.5 ni, 91.6 id,  4.7 wa,  0.0 hi,  0.0 si,  0.0 st
# 物理内存K   total总计        free空闲       used使用        cache缓存硬盘内容
MiB Mem :   3782.6 total,    229.7 free,   1477.6 used,   2075.3 buff/cache
# 交换分区
MiB Swap:      0.0 total,      0.0 free,      0.0 used.   1930.0 avail Mem
# PID USER priority nice 申请内存 实际占有内存 共享内存 状态 CPU MEM 累计时间 命令
    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
 116928 basil     30  10  361492  25844  16328 S   6.2   0.7   0:23.73 flurry
 116951 basil     20   0   15084   4128   3460 R   6.2   0.1   0:00.02 top
      1 root      20   0  169024  13168   8480 S   0.0   0.3   0:15.94 systemd

第一行相当于使用了命令uptime

常用内部命令

  • h|?:帮助
  • M:按内存的使用排序
  • P:按CPU的使用排序
  • N:以PID的大小排序
  • <:向前翻页
  • >:向后翻页
  • z:彩色,Z设置彩色,使用数字调整

使用小技巧

  • -d <num>:每隔<num>秒才刷新
  • -p <pid>[,<pid>[,...]]:只查看某个进程。查看多个进程使用,隔开pid

2.4 nice:进程优先级

每个程序有默认优先级,继承自父进程,为0,尽量只查看,不要修改。调整优先级使用renice <new-nice> <pid>命令。

top命令显示中的优先级有两个,PR和NI,分别是priority以及nice,nice可以调整,而PR值不可以手动调整。nice可供分配的-20~+19,整个系统的PR值范围是-99~+39

两者的对应关系是PR=nice+20:将nice级别显示为映射到更大的优先级队列,-20映射到0,+19映射到39。nice值越大,优先级越低;反之nice值越小,优先级越高。

2.5 使用信号控制进程

$ kill -l  # 列出所有支持的信号
HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM 16 CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH POLL 30 SYS
  • SIGHUP:重新加载配置,kill -1 <program>
  • SIGINT:中断(Ctrl+C),信号值2
  • SIGQUIT:退出(Ctrl+\),类似SIGINT,信号值3
  • SIGKILL:强制退出,无信号kill -9 <program>,强制杀死
  • SIGTERM:终止(正常结束),缺省信号,kill -15 <program>,尽量使用这个
  • SIGCONT:继续
  • SIGSTOP:暂停
  • SIGTSTP:暂停Ctrl+Z,信号值20

2.6 作业控制jobs

&使得命令调到后台执行。

fg是前台命令,foreground,bg是后台命令,background。jobs命令会打印出所有的作业状态。然后使用fg <jobID>调到前台运行,bg <jobID>使后台停止运行的程序继续执行(一般是使用Ctrl+Z使前台进程转到后台并停止运行)。

$ jobs
[1]  + suspended  sleep 1000	# 已停止
[2]    running    sleep 2000	# 后台运行
[3]  - running    sleep 3000	# 后台运行

如果要终止某个程序的执行可以使用kill命令,但是需要执行kill %<jobID>

2.7 虚拟文件系统proc

$ ls /proc
1    496      buddyinfo  devices      interrupts  kmsg           megaraid         net           slabinfo       timer_list
124  52       bus        diskstats    iomem       kpagecgroup    meminfo          offline       softirqs       tkernel
133  63       cgroups    dma          ioports     kpagecount     misc             pagetypeinfo  stat           tty
44   74       cmdline    driver       irq         kpageflags     module_md5_list  partitions    swaps          uptime
448  86       config.gz  execdomains  kallsyms    latency_stats  modules          sched_debug   sys            version
453  97       consoles   fb           kcore       loadavg        mounts           schedstat     sysrq-trigger  vmallocinfo
458  acpi     cpuinfo    filesystems  keys        locks          mpt              scsi          sysvipc        vmstat
463  bt_stat  crypto     fs           key-users   mdstat         mtrr             self          thread-self    zoneinfo

虚拟文件系统,服务器自身、内核、进程运行状态的信息。

/proc/cpuinfo存储着CPU的信息,/proc/meminfo存储着内存信息,/prco/cmdline存储着内核信息。

$ cat /proc/cpuinfo
$ cat /proc/meminfo
$ cat /proc/cmdline
$ ls /boot
$ cat /proc/version