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