一、进程的定义
一个程序运行起来后就是进程了, 其存在生命周期.
1.1 进程是如何创建的.
Linux系统的系统启动过程中内核加载的第一个进程为init(CentOS 7为systemd)进程, 这意味着创建了用户空间; 用户空间的所有进程都由init进程创建, 由其创建的子进程也可以自己生成子进程.
也就是说进程存在着父子关系, 每一个进程都由其父进程创建(通过fork()创建子进程, 使用clone()将数据克隆给子进程).
1.2 进程优先级
进程的优先级范围为0~139, 其中1~99为实时优先级, 100~139为静态优先级; 数字越小, 优先级越高.
Note: nice值可以调整优先级, nice值范围为-20~19.
1.3 进程类型
进程有两种类型, 如下所示:
- 守护进程(deamon): 跟终端无关, 在系统引导过程中启动的进程.
- 前台进程: 跟终端相关, 通过终端启动的进程; 也可把前台启动的进程送往后台, 变为守护模式运行.
1.4 进程状态:
进程状态如下所示:
- 运行态: running
- 就绪态/睡眠态: ready
- 可中断睡眠: interruptable
- 不可中断睡眠: uninterruptable
- 停止态: 暂停于内存中, 但不会被调度, 除非手动启动, stopped
- 僵死态: zombie
二、进程管理相关工具
2.1 pstree命令
pstree - 显示进程树
用法: pstree
[root@zabbix ~]# pstree
systemd─┬─ManagementAgent───2*[{ManagementAgent}]
├─NetworkManager─┬─dhclient
│ └─2*[{NetworkManager}]
├─VGAuthService
├─agetty
├─auditd───{auditd}
├─chronyd
├─crond
├─dbus-daemon
├─dockerd─┬─docker-containe───8*[{docker-containe}]
│ └─9*[{dockerd}]
├─httpd───5*[httpd]
├─irqbalance
├─lvmetad
├─master─┬─pickup
│ └─qmgr
├─mysqld_safe───mysqld───41*[{mysqld}]
├─polkitd───5*[{polkitd}]
├─rsyslogd───2*[{rsyslogd}]
├─sshd───sshd───bash───pstree
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tuned───4*[{tuned}]
├─vmtoolsd───{vmtoolsd}
├─wpa_supplicant
├─zabbix_agentd───6*[zabbix_agentd]
└─zabbix_server───33*[zabbix_server]
2.2 ps命令
ps - 打印系统当前进程状态的快照
用法: ps [OPTIONS]
# ps的选项支持两种风格, 一种选项带“-”号, 一种不带
# 常用组合: aux
# u: 以用户为中心组织进程状态信息显示
# a: 与终端相关的进程
# x: 与终端无关的进程
[root@zabbix ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 43244 3668 ? Ss 19:14 0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root 2 0.0 0.0 0 0 ? S 19:14 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 19:14 0:00 [ksoftirqd/0]
root 6 0.0 0.0 0 0 ? S 19:14 0:00 [kworker/u256:0]
...
每一列的意义:
- VSZ: Virtual memory Size, 虚拟内存集
- RSS: ReSident Size, 常驻内存集
- STAT: 进程状态:
- R: running
- S: interrputable sleeping
- D: uninterrputabl sleeping
- T: stopped
- Z: zombie
- +: 前台进程
- l: 多线程进程
- N: 低优先级进程
- <: 高优先级进程
- s: session leader
# 常用组合: -ef
# -e: 显示所有进程
# -f: 显示完整格式的进程信息
[root@zabbix ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 19:14 ? 00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root 2 0 0 19:14 ? 00:00:00 [kthreadd]
root 3 2 0 19:14 ? 00:00:00 [ksoftirqd/0]
root 6 2 0 19:14 ? 00:00:00 [kworker/u256:0]
root 7 2 0 19:14 ? 00:00:00 [migration/0]
...
# 常用组合: -ejH
# -j: 任务格式
# -H: 以进程层级格式显示进程相关信息
[root@zabbix ~]# ps -ejH
PID PGID SID TTY TIME CMD
2 0 0 ? 00:00:00 kthreadd
3 0 0 ? 00:00:00 ksoftirqd/0
...
1463 1463 1463 ? 00:00:00 httpd
1793 1463 1463 ? 00:00:00 httpd
1808 1463 1463 ? 00:00:00 httpd
1812 1463 1463 ? 00:00:00 httpd
1829 1463 1463 ? 00:00:00 httpd
1839 1463 1463 ? 00:00:00 httpd
1469 1469 1469 ? 00:00:00 sshd
3136 3136 3136 ? 00:00:00 sshd
3139 3139 3139 pts/0 00:00:00 bash
3719 3719 3719 pts/1 00:00:00 bash
4743 4743 3719 pts/1 00:00:00 ps
...
# 常用组合: -eFH
# -F: 显示完整格式的进程信息
[root@zabbix ~]# ps -eFH
UID PID PPID C SZ RSS PSR STIME TTY TIME CMD
root 2 0 0 0 0 1 19:14 ? 00:00:00 [kthreadd]
root 3 2 0 0 0 0 19:14 ? 00:00:00 [ksoftirqd/0]
root 6 2 0 0 0 1 19:14 ? 00:00:00 [kworker/u256:0]
# 常用组合: -eo, axo, 显示自定义字段
# ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm
# ni: nice值
# pri: priority:优先级
# psr: processor, 进程运行在哪颗CPU上
# rtprio: 实时优先级
[root@zabbix ~]# ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm
PID TID CLS RTPRIO NI PRI PSR %CPU STAT WCHAN COMMAND
1 1 TS - 0 19 1 0.0 Ss ep_poll systemd
2 2 TS - 0 19 1 0.0 S kthreadd kthreadd
...
# ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
[root@zabbix ~]# ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
STAT EUID RUID TT TPGID SESS PGRP PPID PID %CPU COMMAND
Ss 0 0 ? -1 1 1 0 1 0.0 systemd
S 0 0 ? -1 0 0 0 2 0.0 kthreadd
...
2.3 pgrep, pkill命令
pgrep, pkill - 基于进程名和进程其他属性查找进程或者发送信号给进程
用法: pgrep [option] pattern
用法: pkill [option] pattern
# 选项:
# -U uid: 有效用户
# -u uid: 实时用户
# -t terminal: 与指定终端相关进程
# -l: 显示进程名
# -a: 显示完整格式的进程名
# -P pid: 显示其父进程为此处指定的进程的进程列表
[root@zabbix ~]# pgrep sshd -l
1433 sshd
3088 sshd
[root@zabbix ~]# pgrep -u root -l
1 systemd
2 kthreadd
3 ksoftirqd/0
6 kworker/u256:0
...
[root@zabbix ~]# pgrep -u root -a
1 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
2 kthreadd
3 ksoftirqd/0
...
[root@zabbix ~]# pgrep -P 1472 -l
1629 docker-containe
# pkill根据进程名或者上面选项杀死相关进程
[root@zabbix ~]# pkill httpd
[root@zabbix ~]# ps aux | grep httpd
root 3285 0.0 0.0 112644 952 pts/0 S+ 20:26 0:00 grep --color=auto httpd
2.4 pidof命令
pidof - 根据进程名获取pid号
用法: pidof Process_Name
[root@zabbix ~]# pidof sshd
3088 1433
2.5 top命令
top - 交互式进程查看命令
用法: top [options]
# options:
# -d seconds: 指定刷新时间间隔
# -b: 以批次方式显示
# -n Number: 显示多少次
[root@zabbix ~]# top
top - 20:53:28 up 31 min, 2 users, load average: 0.00, 0.01, 0.05
Tasks: 400 total, 1 running, 399 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.7 us, 1.0 sy, 0.0 ni, 98.2 id, 0.0 wa, 0.0 hi, 0.2 si, 0.0 st
KiB Mem : 1868688 total, 1265852 free, 262980 used, 339856 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 1417916 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2021 mysql 20 0 1632500 106580 9380 S 1.0 5.7 0:16.87 mysqld
3959 root 20 0 146436 2344 1424 R 1.0 0.1 0:00.07 top
3426 root 20 0 0 0 0 S 0.7 0.0 0:02.16 kworker/1:2
1440 root 20 0 436816 25064 13508 S 0.3 1.3 0:06.17 dockerd
1470 zabbix 20 0 82384 2412 1452 S 0.3 0.1 0:01.22 zabbix_agentd
1625 root 20 0 226888 7604 4220 S 0.3 0.4 0:04.36 docker-containe
3049 zabbix 20 0 260448 2616 420 S 0.3 0.1 0:00.35 zabbix_server
3052 zabbix 20 0 367412 5420 2172 S 0.3 0.3 0:00.60 zabbix_server
3064 zabbix 20 0 260448 3220 1016 S 0.3 0.2 0:01.29 zabbix_server
1 root 20 0 190692 3648 2400 S 0.0 0.2 0:01.17 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.04 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/u256:0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.03 migration/0
...
# top有许多内置命令:
# 排序:
# P: 以占据的CPU百分比排序
# M: 以占据内存百分比排序
# T: 累计占据CPU时长排序
# 首部信息显示:
# uptime信息: l命令
# tasks及cpu信息: t命令
# cpu分别显示: 1(数字)
# memory信息: m命令
# 退出命令: q
# 修改刷新时间间隔: s
# 终止指定进程: k
2.6 htop
htop - 交互式进程查看命令, 需要使用epel源
用法: htop [options]
# options:
# -d seconds: 指定延迟时间
# -u UserName: 仅显示指定用户的进程
# -s COLOMN: 以指定字段进行排序
# 内建命令:
# s: 跟着选定进程的系统调用
# l: 显示选定进程打开的文件列表
# a: 将选定进程绑定至某指定CPU核心
# t: 显示进程树
2.7 vmstat
vmstat - 打印虚拟内存统计数据
用法: vmstat [options] [delay [count]]
# options:
# -d: 打印磁盘统计数据
# -p device: 打印指定分区的统计数据
# -t: 给每一行追加时间戳
[root@zabbix ~]# vmstat -d
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sda 6838 8 613755 4790 12258 84 531972 37083 0 10
sr0 0 0 0 0 0 0 0 0 0 0
dm-0 6322 0 554278 4356 11317 0 527876 37347 0 10
dm-1 126 0 2136 24 0 0 0 0 0 0
[root@zabbix ~]# vmstat -p /dev/sda1
sda1 reads read sectors writes requested writes
200 54733 1025 4096
[root@zabbix ~]# vmstat -t
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- -----timestamp-----
r b swpd free buff cache si so bi bo in cs us sy id wa st CST
1 0 0 1186244 948 417640 0 0 52 48 86 157 0 1 99 0 0 2018-01-28 21:11:25
# 不跟选项默认打印内存统计数据
[root@zabbix ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
6 0 0 1186596 948 417512 0 0 56 49 87 159 1 1 99 0 0
2.8 sar
sar - Collect, report, or save system activity information
2.9 iostat
iostat - 为设备和分区打印CPU和IO统计数据
用法: iostat [options] [devices|partitions]
[root@zabbix ~]# iostat /dev/sda1 /dev/mapper/centos_docker--package-root
Linux 3.10.0-327.el7.x86_64 (zabbix.leistudy.com) 01/28/2018 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.60 0.00 0.89 0.07 0.00 98.44
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda1 0.34 7.60 0.57 27366 2060
dm-0 6.37 94.37 144.54 339783 520411
2.10 iftop
iftop - 显示主机网络接口带宽使用情况
用法: iftop [-nNpblBP] [-i interface] [-f filter code] [-F net/mask]
[root@zabbix ~]# iftop -i eno16777736 -nN
12.5Kb 25.0Kb 37.5Kb 50.0Kb 62.5Kb
└──────────────────────────┴──────────────────────────┴───────────────────────────┴──────────────────────────┴───────────────────────────
192.168.123.132 => 192.168.123.1 3.41Kb 4.91Kb 3.39Kb
<= 480b 2.81Kb 1.38Kb
192.168.123.132 => 192.168.123.2 1.12Kb 623b 283b
<= 1.12Kb 670b 305b
192.168.123.132 => 111.13.100.92 672b 336b 153b
<= 672b 336b 153b
...
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
TX: cum: 10.5KB peak: 9.65Kb rates: 5.19Kb 5.84Kb 3.82Kb
RX: 5.01KB 7.60Kb 2.25Kb 3.79Kb 1.82Kb
TOTAL: 15.5KB 17.2Kb 7.44Kb 9.63Kb 5.64Kb
2.11 glances
glances - 一个跨平台基于指针的系统监视工具
用法: glances [options]
# 不跟选项, 默认显示所有的信息
[root@zabbix ~]# glances
zabbix.leistudy.com (CentOS Linux 7.2.1511 64bit / Linux 3.10.0-327.el7.x86_64) Uptime: 0:21:25
CPU [| 4.5%] CPU 4.5% nice: 0.0% MEM 20.7% active: 306M SWAP 0.0% LOAD 2-core
MEM [||||| 20.7%] user: 2.5% irq: 0.0% total: 1.78G inactive: 267M total: 2.00G 1 min: 0.05
SWAP [ 0.0%] system: 1.7% iowait: 0.0% used: 377M buffers: 948K used: 0 5 min: 0.03
idle: 95.8% steal: 0.0% free: 1.41G cached: 369M free: 2.00G 15 min: 0.05
NETWORK Rx/s Tx/s TASKS 409 (484 thr), 1 run, 408 slp, 0 oth sorted automatically by cpu_percent, flat view
docker0 0b 0b
_16777736 144b 10Kb CPU% MEM% VIRT RES PID USER NI S TIME+ IOR/s IOW/s Command
lo 172Kb 172Kb 6.7 1.0 227M 18.0M 3737 root 0 R 0:01.21 0 0 /usr/bin/python /usr/bin/glances
0.6 0.5 150M 9.77M 1643 root 0 S 0:02.62 0 0 docker-containerd -l unix:///var/run/dock
DISK I/O R/s W/s 0.6 5.9 1.56G 107M 2000 mysql 0 S 0:10.60 0 4K /usr/libexec/mysqld --basedir=/usr --data
dm-0 1K 12K 0.3 1.4 427M 24.7M 1464 root 0 S 0:03.94 0 0 /usr/bin/dockerd
dm-1 0 0 0.3 0.2 254M 3.14M 3120 zabbix 0 S 0:00.80 0 0 /usr/sbin/zabbix_server: alert manager #1
sda1 0 0 0.3 0.4 242M 7.80M 1187 root 0 S 0:02.82 0 0 /usr/sbin/vmtoolsd
sda2 1K 12K 0.3 0.0 0 0 864 root 0 S 0:04.33 0 0 kworker/0:3
sr0 0 0 0.3 0.2 254M 2.82M 3088 zabbix 0 S 0:00.23 0 0 /usr/sbin/zabbix_server: http poller #1 [
0.3 0.9 540M 16.0M 1460 root 0 S 0:00.56 0 0 /usr/bin/python -Es /usr/sbin/tuned -l -P
FILE SYS Used Total 0.0 0.2 254M 3.77M 3115 zabbix 0 S 0:00.00 0 0 /usr/sbin/zabbix_server: trapper #4 [proc
/ 8.84G 17.5G 0.0 0.0 0 0 121 root 0 S 0:00.00 0 0 rcuob/112
/boot 184M 497M 0.0 0.0 0 0 111 root 0 S 0:00.00 0 0 rcuob/102
_/overlay 8.84G 17.5G 0.0 0.0 0 0 226 root 0 S 0:00.00 0 0 rcuos/88
0.0 0.0 0 0 94 root 0 S 0:00.00 0 0 rcuob/85
0.0 0.0 0 0 68 root 0 S 0:00.00 0 0 rcuob/59
0.0 0.0 0 0 42 root 0 S 0:00.00 0 0 rcuob/33
0.0 0.0 0 0 16 root 0 S 0:00.00 0 0 rcuob/7
0.0 0.0 0 0 529 root -20 S 0:00.00 0 0 ata_sff
0.0 0.0 0 0 623 root -20 S 0:00.00 0 0 kdmflush
0.0 0.1 42.5M 2.14M 755 root 0 S 0:00.12 0 0 /usr/lib/systemd/systemd-udevd
0.0 0.0 0 0 266 root 0 S 0:00.10 0 0 watchdog/0
0.0 0.0 0 0 162 root 0 S 0:00.00 0 0 rcuos/24
0.0 0.0 0 0 7 root 0 S 0:00.50 0 0 migration/0
0.0 0.0 0 0 549 root -20 S 0:00.00 0 0 ttm_swap
0.0 0.0 0 0 237 root 0 S 0:00.00 0 0 rcuos/99
0.0 0.0 0 0 225 root 0 S 0:00.00 0 0 rcuos/87
0.0 0.0 0 0 248 root 0 S 0:00.00 0 0 rcuos/110
0.0 0.0 0 0 267 root 0 S 0:00.10 0 0 watchdog/1
0.0 0.0 0 0 189 root 0 S 0:00.00 0 0 rcuos/51
0.0 0.0 0 0 208 root 0 S 0:00.00 0 0 rcuos/70
0.0 0.0 0 0 853 root -20 S 0:00.00 0 0 xfs-data/sda1
0.0 0.0 0 0 212 root 0 S 0:00.00 0 0 rcuos/74
2018-01-29 10:20:35 No warning or critical alert detected
# 在glances中可以使用子命令进行交互
# a: 自动排序进程表
# b: 网络IO显示在bit/s和Bytes/s之间切换
# c: 通过CPU使用率排序
# d: 显示或者隐藏磁盘I/O信息
# f: 显示或隐藏文件系统信息
# n: 显示或隐藏网络接口信息
# 1: 在全局CPU和每颗CPU状态之间切换
# 2: 隐藏左边的网络IO、DISK I/O、FILE SYSTEM信息
# Enter键: 通过模式过滤进程
Process filter pattern: httpd
Processes filter: httpd (press ENTER to edit)
TASKS 6 (6 thr), 0 run, 6 slp, 0 oth sorted by io_counters, flat view
CPU% MEM% VIRT RES PID USER NI S TIME+ IOR/s IOW/s Command
0.0 0.8 446M 14.9M 1462 root 0 S 0:00.43 0 0 /usr/sbin/httpd -DFOREGROUND
CPU affinity: 2 cores
Memory info: shared 8.80M text 484K lib 0 data 77.5M dirty 0 swap 0
Open: threads 1 files 8 TCP 1 UDP 0
IO nice: No specific I/O priority
0.0 0.4 447M 7.44M 1863 apache 0 S 0:00.00 0 0 /usr/sbin/httpd -DFOREGROUND
0.0 0.4 447M 7.44M 1880 apache 0 S 0:00.00 0 0 /usr/sbin/httpd -DFOREGROUND
0.0 0.4 447M 7.44M 1894 apache 0 S 0:00.00 0 0 /usr/sbin/httpd -DFOREGROUND
0.0 0.4 447M 7.44M 1873 apache 0 S 0:00.00 0 0 /usr/sbin/httpd -DFOREGROUND
0.0 0.4 447M 7.44M 1887 apache 0 S 0:00.00 0 0 /usr/sbin/httpd -DFOREGROUND
______________________________________________________________________
0.0 2.9 2.62G 52.1M 0 0
# glances还可以运行在C/S模式下
# -s: 运行glances在server模式
# -B IPADDR: 绑定IP
# -p PORT: 指定端口号, 默认为61209
# -c CLIENT: 通过IP地址或者主机名连接至一个glances服务器
[root@zabbix ~]# glances -s -B 192.168.123.132 -p 12345
Glances server is running on 192.168.123.132:12345
[root@zabbix ~]# glances -c 192.168.123.132 -p 12345
2.12 dstat
dstat - 生成系统资源统计信息的通用工具
用法: dstat [options]
# 直接使用显示CPU, DISK, NETWORK, PAGING, SYSTEM信息
[root@zabbix ~]# dstat
You did not select any stats, using -cdngy by default.
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
# -d: 只显示磁盘IO信息
0 0 100 0 0 0|4096B 8192B| 270B 540B| 0 0 | 147 270 ^C
[root@zabbix ~]# dstat -d
-dsk/total-
read writ
# -c: 只显示cpu使用情况
[root@zabbix ~]# dstat -c
----total-cpu-usage----
usr sys idl wai hiq siq
# -n: 只显示network信息
[root@zabbix ~]# dstat -n
-net/total-
recv send
# -m: 只显示内存信息
[root@zabbix ~]# dstat -m
------memory-usage-----
used buff cach free
# -s: 只显示swap信息
[root@zabbix ~]# dstat -s
----swap---
used free
# -y: 只显示system状态(中断, 上下文切换)
[root@zabbix ~]# dstat -y
---system--
int csw
# -g: 显示页缓存状态(page in, page out)
[root@zabbix ~]# dstat -g
---paging--
in out
# -afv: 显示所有信息, 根据teminal大小显示选项, 如果terminal不够大, 则自动删除一些信息
[root@zabbix ~]# dstat -afv
Terminal width too small, trimming output.
-------cpu0-usage--------------cpu1-usage------ --dsk/sda-- net/eno1677 ---paging-- ---system-- ---procs--- ------memory-usage----->
usr sys idl wai hiq siq:usr sys idl wai hiq siq| read writ| recv send| in out | int csw |run blk new| used buff cach free>