程序
什么是程序?
- 是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具。
- 用于描述进程要完成的功能,是控制进程执行的指令集。
- 保存在硬盘、光盘等介质中的可执行代码和数据。
- 静态保存的代码。
进程
什么是进程
运行中的程序的一个副本,是被载入内存的一个指令集合,是资源分配的单位。
- 在CPU及内存中运行的程序代码
- 动态执行的代码
- 进程ID(Process ID,PID)号码被用来标记各个进程
- UID、GID、和SELinux语境决定对文件系统的存取和访问权限
- 通常从执行进程的用户来继承
- 存在生命周期
- 都由其父进程创建
进程是已启动的可执行程序的运行实例,进程有以下组成部分
- 已分配内存的地址空间;
- 安全属性,包括所有权凭据和特权;
- 有权限限制;
- 程序代码的一个或多个执行线程;
父进程与子进程
父进程复制自己的地址空间(fork派生)创建一个新的(子)进程结构。
每个进程分配一个唯一的进程ID(PID),满足跟踪安全性之需。
任何进程都可以创建子进程。
所有进程都是第一个系统进程的后代。
进程具有的特征
- 动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的;
- 并发性:任何进程都可以同其他进程一起并发执行;
- 独立性:进程是系统进行资源分配和调度的一个独立单位;
- 结构性:进程由程序、数据和进程控制块三部分组成。
僵尸进程
一个进程结束了,但是如果该进程的父母进程已经先结束了,那么该进程就不会变成僵尸进程,因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,系统都会扫描当前系统中所运行的所有进程,看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由init来接管它,成为它的父进程,子进程退出后init会回收其占用的相关资源。但是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。
查看进程
ps命令 ---查看静态的进程统计信息
常用选项
- a:显示当前终端下的所有进程信息,包括其他用户的进程。与“x”选项结合时将示系统中所有的进程信息。
- u:使用以用户为主的格式输出进程信息。
- x:显示当前用户在所有终端下的进程信息。
- -e:显示系统内的所有进程信息。
- -l:使用长(Long)格式显示进程信息。
- -f:使用完整的(Full)格式显示进程信
- -T:查看线程信息
ps aux
使用“ps aux”命令查看进程信息:
[root@localhost ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 193832 7068 ? Ss 10:42 0:01 /us
root 2 0.0 0.0 0 0 ? S 10:42 0:00 [kt
root 3 0.0 0.0 0 0 ? S 10:42 0:00 [ks
root 5 0.0 0.0 0 0 ? S< 10:42 0:00 [kw
root 6 0.0 0.0 0 0 ? S 10:42 0:00 [kw
各列的解释
| 表头(列名) | 含义 |
|---|---|
| USER | 该进程是由哪个用户产生的。 |
| PID | 进程的 ID。 |
| %CPU | 该进程占用 CPU 资源的百分比,占用的百分比越高,进程越耗费资源。 |
| %MEM | 该进程占用物理内存的百分比,占用的百分比越高,进程越耗费资源。 |
| VSZ | 该进程占用虚拟内存的大小,单位为 KB。 |
| RSS | 该进程占用实际物理内存的大小,单位为 KB。 |
| TTY | 该进程是在哪个终端运行的。 其中,tty1 ~ tty7 代表本地控制台终端(可以通过 Alt+F1 ~ F7 快捷键切换不同的终端),tty1~tty6 是本地的字符界面终端,tty7 是图形终端。 pts/0 ~ 255 代表虚拟终端,一般是远程连接的终端,第一个远程连接占用 pts/0,第二个远程连接占用 pts/1,依次増长。 |
| STAT | 进程状态。常见的状态有以下几种: -D:不可被唤醒的睡眠状态,通常用于 I/O 情况。 -R:该进程正在运行。 -S:该进程处于睡眠状态,可被唤醒。 -T:停止状态,可能是在后台暂停或进程处于除错状态。 -W:内存交互状态(从 2.6 内核开始无效)。 -X:死掉的进程(应该不会出现)。 -Z:僵尸进程。进程已经中止,但是还是占用硬件资源。 -<:高优先级(以下状态在 BSD 格式中出现)。 -N:低优先级。 -L:被锁入内存。 -s:包含子进程。 -l:多线程(小写 L)。 -+:进程位于后台。 |
| START | 该进程的启动时间。 |
| TIME | 该进程占用 CPU 的运算时间,注意不是系统时间。 |
| COMMAND | 产生此进程的命令名。 |
ps -elf
使用“ps -elf”命令查看进程信息
[root@localhost ~]# ps -elf
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 48458 ep_pol 10:42 ? 00:00:01 /usr/lib/systemd/systemd --switch
1 S root 2 0 0 80 0 - 0 kthrea 10:42 ? 00:00:00 [kthreadd]
1 S root 3 2 0 80 0 - 0 smpboo 10:42 ? 00:00:00 [ksoftirqd/0]
1 S root 5 2 0 60 -20 - 0 worker 10:42 ? 00:00:00 [kworker/0:0H]
1 S root 6 2 0 80 0 - 0 worker 10:42 ? 00:00:00 [kworker/u256:0]
各列的解释
| 表头(列名) | 含义 |
|---|---|
| F | 进程标志,说明进程的权限,常见的标志有两个: 1:进程可以被复制,但是不能被执行; 4:进程使用超级用户权限; |
| S | 进程状态。具体的状态和"psaux"命令中的 STAT 状态一致; |
| UID | 运行此进程的用户的 ID; |
| PID | 进程的 ID; |
| PPID | 父进程的 ID; |
| C | 该进程的 CPU 使用率,单位是百分比; |
| PRI | 进程的优先级,数值越小,该进程的优先级越高,越早被 CPU 执行;系统定义不可以人为修改 |
| NI | 进程的优先级,数值越小,该进程越早被执行;可以人为修改 |
| ADDR | 该进程在内存的哪个位置; |
| SZ | 该进程占用多大内存; |
| WCHAN | 该进程是否运行。"-"代表正在运行; |
| TTY | 该进程由哪个终端产生; |
| TIME | 该进程占用 CPU 的运算时间,注意不是系统时间; |
| CMD | 产生此进程的命令名; |
top命令——动态查看进程
op 命令可以动态地持续监听进程地运行状态,与此同时,该命令还提供了一个交互界面,用户可以根据需要,人性化地定制自己的输出,进而更清楚地了进程的运行状态。
选项
| 选项 | 作用 |
|---|---|
| -d 秒数 | 指定 top 命令每隔几秒更新。默认是 3 秒 |
| -b | 使用批次处理模式输出。一般和"-n"选项合用,用于把 top 命令重定向到文件中 |
| -n 次数 | 指定 top 命令执行的次数。一般和"-"选项合用 |
| -p 进程PID | 仅查看指定 ID 的进程 |
| -s | 使 top 命令在安全模式中运行,避免在交互模式中出现错误 |
| -u 用户名 | 只监听某个用户的进程 |
常用命令
| 命令 | 作用 |
|---|---|
| p | 根据cpu使用百分比大小进行排序 |
| M | 按照内存(memory)的使用率排序 |
| N | 按照 PID 排序 |
| c | 按照 CPU 的使用率排序,默认就是此选项 |
| h | 可以获得 top程序的在线帮助信息 |
| k | 按照 PID 给予某个进程一个信号。一般用于中止某个进程,信号 9 是强制中止的信号 |
| q | 退出 top 命令 |
| 数字1 | 显示cpu个数和状态 |
top -H:显示所有线程
top -H-p <pid>:显示特定进程中的线程
top命令输出内容
top 命令的输出内容是动态的,默认每隔 3 秒刷新一次。
命令的输出主要分为两部分:
- 第一部分是前五行,显示的是整个系统的资源使用状况,我们就是通过这些输出来判断服务器的资源使用状态的。
- 第二部分从第六行开始,显示的是系统中进程的信息。
top命令输出内容——第一部分详解
第一部分是前五行,显示的是整个系统的资源使用状况。
top - 15:42:37 up 35 min, 2 users, load average: 0.28, 0.37, 0.30
Tasks: 169 total, 1 running, 168 sleeping, 0 stopped, 0 zombie
%Cpu(s): 6.0 us, 9.4 sy, 0.0 ni, 84.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1867024 total, 1243576 free, 255592 used, 367856 buff/cache
KiB Swap: 4194300 total, 4194300 free, 0 used. 1423048 avail Mem
- 第一行是任务队列信息
- 第二行是进程信息
- 第三行是 CPU 信息
- 第四行是物理内存信息
- 第五行是交换分区(swap)信息
top命令输出内容——第二部分详解
top 命令的第二部分输出,主要是系统进程信息,各个字段的含义如下:
| 表头(字段名) | 说明 |
|---|---|
| PID | 进程的 ID号 |
| USER | 该进程所属的用户 |
| PR | priority优先级,数值越小 优先级越高 |
| NI | nice优先级,数值越小 优先级越高 |
| VIRT | 该进程使用的虚拟内存的大小,单位为 KB |
| RES | 该进程使用的物理内存的大小,单位为 KB |
| SHR | 共享内存大小,单位为 KB |
| S | 进程状态 |
| %CPU | 该进程占用 CPU 的百分比 |
| %MEM | 该进程占用内存的百分比 |
| TIME+ | 该进程总共占用的 CPU 时间 |
| COMMAND | 进程的命令名(进程文件、进程名称) |
pgrep命令——查询进程的PID
选项
-
-U:指定用户
-
-l:显示进程名
-
-a:显示完整格式的进程名
-
-P < PID>:显示指定进程的子进程
[root@localhost ~]# pgrep -U root -l //查询nancy用户的进程PID,并显示进程名
1 systemd
2 kthreadd
3 ksoftirqd/0
[root@localhost ~]# pgrep "log" -l ////查询进程名称中带有"log"的进程的PID,并显示进程名称
465 xfs-log/dm-0
707 xfs-log/sda1
728 xfs-log/dm-2
801 systemd-logind
803 abrt-watch-log
806 abrt-watch-log
814 rsyslogd
[root@localhost ~]# pgrep -P 823 //查询PID为823的进程的子进程
846
prtstat命令——查看指定的进程
命令格式
prtstat [options] PID
常用选项
-r :格式显示(raw)
[root@localhost ~]# prtstat 825
Process: accounts-daemon State: S (sleeping)
CPU#: 2 TTY: 0:0 Threads: 3
Process, Group and Session IDs
Process ID: 825 Parent ID: 1
Group ID: 825 Session ID: 825
T Group ID: -1
Page Faults
This Process (minor major): 1751 9
Child Processes (minor major): 0 0
CPU Times
This Process (user system guest blkio): 0.03 0.07 0.00 0.00
Child processes (user system guest): 0.00 0.00 0.00
Memory
Vsize: 401 MB
RSS: 4296 kB RSS Limit: 18446744073709 MB
Code Start: 0x56554aac7000 Code Stop: 0x56554aaea89c
Stack Start: 0x7ffc83da0670
Stack Pointer (ESP): 0x7ffc83da04c0 Inst Pointer (EIP): 0x7fee3737aa3d
Scheduling
Policy: normal
Nice: 0 RT Priority: 0 (non RT)
[root@localhost ~]# prtstat -r 825
pid: 825 comm: accounts-daemon
state: S ppid: 1
pgrp: 825 session: 825
tty_nr: 0 tpgid: -1
flags: 40402100 minflt: 1751
cminflt: 0 majflt: 9
cmajflt: 0 utime: 3
stime: 7 cutime: 0
cstime: 0 priority: 20
nice: 0 num_threads: 3
itrealvalue: 0 starttime: 556
vsize: 401608704 rss: 1049
rsslim: 18446744073709551615 startcode: 94924325023744
endcode: 94924325169308 startstack: 140722520589936
kstkesp: 7FFC83DA04C0 kstkeip: 7FEE3737AA3D
wchan: 18446744073709551615 nswap: 0
cnswap: 18446744073709551615 exit_signal: 17
processor: 2 rt_priority: 0
policy: 0 delayaccr_blkio_ticks: 0
guest_time: 0 cguest_time: 0
pstree命令——以树形结构列出进程信息
格式
pstree [OPTION] [ PID | USER ]
选项
| 选项 | 作用 |
|---|---|
| -a | 显示启动每个进程对应的完整指令,包括启动进程的路径、参数等 |
| -p | 显示PID |
| -p < pid> | 显示指定进程及其子进程,同时显示每个进程的PID |
| -u | 显示进程的用户名称 |
| -H < pid> | 高亮显示指定进程及其前辈进程 |
| -T | 不显示线程thread,默认显示线程 |
示例
pstree PID,显示指定进程及其子进程
[root@localhost ~]# pstree 1
systemd─┬─ModemManager───2*[{ModemManager}]
├─NetworkManager───2*[{NetworkManager}]
├─VGAuthService
├─2*[abrt-watch-log]
├─abrtd
├─accounts-daemon───2*[{accounts-daemon}]
├─alsactl
├─at-spi-bus-laun─┬─dbus-daemon───{dbus-daemon}
│ └─3*[{at-spi-bus-laun}]
pstree -p PID,显示指定进程及其子进程,同时显示PID
[root@localhost ~]# pstree -p 2261
tracker-store(2261)─┬─{tracker-store}(2265)
├─{tracker-store}(2277)
├─{tracker-store}(2278)
├─{tracker-store}(2281)
├─{tracker-store}(2282)
├─{tracker-store}(2283)
└─{tracker-store}(2284)
pstree -u 用户名,显示指定用户的进程
[root@localhost ~]# pstree -u root -p
systemd(1)─┬─ModemManager(815)─┬─{ModemManager}(838)
│ └─{ModemManager}(845)
├─NetworkManager(891)─┬─{NetworkManager}(899)
│ └─{NetworkManager}(903)
├─VGAuthService(798)
├─abrt-watch-log(803)
├─abrt-watch-log(806)
├─abrtd(802)
├─accounts-daemon(825)─┬─{accounts-daemon}(832)
│ └─{accounts-daemon}(853)
-a,显示启动进程的完整指令,包括启动进程的路径、参数等
[root@localhost ~]# pstree 2261 -a
tracker-store
└─7*[{tracker-store}]
-aup,同时显示启动进程的完整指令、进程的所属用户、进程PID
[root@localhost ~]# pstree -aup
systemd,1 --switched-root --system --deserialize 21
├─ModemManager,815
│ ├─{ModemManager},838
│ └─{ModemManager},845
├─NetworkManager,891 --no-daemon
│ ├─{NetworkManager},899
│ └─{NetworkManager},903
├─VGAuthService,798 -s
├─abrt-watch-log,803 -F BUG: WARNING: at WARNING: CPU:INFO: possib
├─abrt-watch-log,806 -F Backtrace /var/log/Xorg.0.log --/usr/bin/a
├─abrtd,802 -d -s
lsof命令——列举被打开的文件
格式
lsof [options]
常用选项
| 选项 | 功能 |
|---|---|
| -c 字符串 | 只列出以字符串开头的进程打开的文件。 |
| +d 目录名 | 列出某个目录中所有被进程调用的文件。 |
| -u 用户名 | 只列出某个用户的进程打开的文件。 |
| -p pid | 列出某个 PID 进程打开的文件。 |
示例
[root@localhost ~]# lsof | more //查询系统中所有进程调用的文件
[root@localhost ~]# lsof +d /dev |more //显示/dev目录下所有被打开的文件及对应进程
[root@localhost ~]# lsof -u nancy //查询nancy用户打开的所有文件
[root@localhost ~]# lsof -p 2261 //查询655进程打开的所有文件
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
tracker-s 2261 root cwd DIR 253,0 224 64 /
tracker-s 2261 root rtd DIR 253,0 224 64 /
tracker-s 2261 root txt REG 253,0 142928 34995294 /usr/libexec/tracker-store
tracker-s 2261 root mem REG 253,0 44448 33604117 /usr/lib64/librt-2.17.so
tracker-s 2261 root mem REG 253,0 14872 33604
[root@localhost ~]# lsof /bin/bash //查询打开/bin/bash文件的所有进程
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ksmtuned 868 root txt REG 253,0 960472 7058 /usr/bin/bash
bash 2656 root txt REG 253,0 960472 7058 /usr/bin/bash
bash 3113 root txt REG 253,0 960472 7058 /usr/bin/bash
vmstat命令——监控系统资源
格式一
vmstat [-a] [刷新延时 刷新次数]
#-a:显示活跃和非活跃内存
示例
[root@localhost ~]# vmstat 3 2
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 471364 2156 582072 0 0 3 0 13 12 0 0 100 0 0
0 0 0 471224 2156 582072 0 0 0 0 84 73 0 0 100 0 0
字段含义
| 字段 | 含义 |
|---|---|
| procs | 进程信息字段: -r:等待运行的进程数,数量越大,系统越繁忙。 -b:不可被唤醒的进程数量,数量越大,系统越繁忙。 |
| memory | 内存信息字段: -swpd:虚拟内存的使用情况,单位为 KB。 -free:空闲的内存容量,单位为 KB。 -buff:缓冲的内存容量,单位为 KB。 -cache:缓存的内存容量,单位为 KB。 |
| swap | 交换分区信息字段: -si:从磁盘中交换到内存中数据的数量,单位为 KB。 -so:从内存中交换到磁盘中数据的数量,单位为 KB。 这两个数越大,表明数据需要经常在磁盘和内存之间进行交换,系统性能越差。 |
| io | 磁盘读/写信息字段: -bi:从块设备中读入的数据的总量,单位是块。 -bo:写到块设备的数据的总量,单位是块。这两个数越大,代表系统的 I/O 越繁忙。 |
| system | 系统信息字段: -in:每秒被中断的进程次数。 -cs:每秒进行的事件切换次数。 这两个数越大,代表系统与接口设备的通信越繁忙。 |
| cpu | CPU信息字段: -us:非内核进程消耗 CPU 运算时间的百分比。 -sy:内核进程消耗 CPU 运算时间的百分比。 -id:空闲 CPU 的百分比。 -wa:等待 I/O 所消耗的 CPU 百分比。 -st:被虚拟机所盗用的 CPU 百分比 |
格式二
vmstat [选项]...
选项:
| 选项 | 含义 |
|---|---|
| -f | 显示从启动到目前为止,系统复制(fork)的程序数。此信息是从 /proc/stat 中的 processes 字段中取得的。 |
| -s | 将从启动到目前为止,由一些事件导致的内存变化情况列表说明。这些信息的分别来自于/proc/meminfo,/proc/stat和/proc/vmstat。 |
| -S 单位 | 令输出的数据显示单位,例如用 K/M 取代 bytes 的容量。 |
| -d | 列出硬盘有关读写总量的统计表。 |
| -p 分区设备文件名 | 查看硬盘分区的读写情况。 |
示例
-f,显示从启动到目前为止,系统共fork(派生)的程序数。
[root@localhost ~]# vmstat -f
7144 forks
-S 单位,令输出的数据按指定单位显示。k/K,以KB为单位;m/M,以MB为单位
[root@localhost ~]# vmstat -S k //令输出的内容以KB为单位
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 482615 2207 595976 0 0 3 0 13 12 0 0 100 0 0
[root@localhost ~]# vmstat -S m //令输出的内容以MB为单位
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 482 2 595 0 0 3 0 13 12 0 0 100 0 0
-d,列出硬盘有关读写总量的统计表
[root@localhost ~]# vmstat -d
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sdb 320 0 17292 23 0 0 0 0 0 0
sda 14135 16 1021910 3828 2363 176 53107 830 0 2
sr0 29 0 2100 23 0 0 0 0 0 0
dm-0 11856 0 948955 3657 2531 0 44915 933 0 2
dm-1 94 0 4456 3 0 0 0 0 0 0
dm-2 178 0 3999 14 4 0 4096 4 0 0
-s,显示内存相关统计信息及多种系统活动数量
[root@localhost ~]# vmstat -s
1867048 K total memory
811452 K used memory
743824 K active memory
360724 K inactive memory
471388 K free memory
2156 K buffer memory
582052 K swap cache
2097148 K total swap
0 K used swap
2097148 K free swap
1245 non-nice user cpu ticks
8 nice user cpu ticks
3752 system cpu ticks
20274118 idle cpu ticks
183 IO-wait cpu ticks
0 IRQ cpu ticks
84 softirq cpu ticks
0 stolen cpu ticks
520651 pages paged in
26600 pages paged out
0 pages swapped in
0 pages swapped out
2540589 interrupts
2354154 CPU context switches
1660185747 boot time
7204 forks
-p 分区设备文件名,查看硬盘分区的读写情况
[root@localhost ~]# vmstat -p /dev/sdb1
sdb1 reads read sectors writes requested writes
70 4320 0 0