程序
什么是程序
- 是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具
- 用于描述进程要完成的功能,是控制进程执行的指令集
- 保存在硬盘、光盘等介质中的可执行代码和数据
- 静态保存的代码
进程
什么是进程
运行中的程序的一个副本,是被载入内存的一个指令集合,是资源分配的单位,
- 进程ID(Process ID,PID)号码被用来标记各个进程
- UID、GID语境决定对文件系统的存取和访问权限
- 通常从执行进程的用户来继承
- 存在生命周期
- 都由其父进程创建
进程创建:
- init:第一个进程,从 CentOS7 以后为systemd
- 进程:都由其父进程创建,fork(),父子关系,CoW:Copy On Write
进程具有的特征
- 动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的;
- 并发性:任何进程都可以同其他进程一起并发执行;
- 独立性:进程是系统进行资源分配和调度的一个独立单位;
- 结构性:进程由程序、数据和进程控制块三部分组成。
僵尸进程
僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。如果父进程先退出 ,子进程被init接管,子进程退出后init会回收其占用的相关资源。
在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程。 但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程, 因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程, 看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由init 来接管他,成为他的父进程。
查看进程
ps(静态查看进程)
ps 即 process state,可以查看进程当前状态的快照,默认显示当前终端中的进程,Linux系统各进程的相关信息均保存在/proc/数字 目录/status 下的各文件中。
常用选项
| 选项 | 作用 |
|---|---|
| -a | 显示当前终端下的所有进程信息,包括其他用户的进程。与“x”选项结合时将示系统中所有的进程信息。 |
| -u | 使用以用户为主的格式输出进程信息。 |
| -x | 显示当前用户在所有终端下的进程信息 |
| -e | 显示系统内的所有进程信息 |
| -l | 使用长(Long)格式显示进程信息。 |
| -f | 使用完整的(Full)格式显示进程信 |
- "ps aux" 可以查看系统中所有的进程;
- "ps -le" 可以查看系统中所有的进程,而且还能看到进程的父进程的 PID 和进程优先级;
- "ps -l" 只能看到当前 Shell 产生的进程。
ps aux
查看进程信息
[root@localhost ~]# ps aux |head -10
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
//11个字段
root 1 1.5 0.3 128164 6824 ? Ss 03:23 0:00 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root 2 0.0 0.0 0 0 ? S 03:23 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 03:23 0:00 [ksoftirqd/0]
root 4 0.0 0.0 0 0 ? S 03:23 0:00 [kworker/0:0]
root 5 0.0 0.0 0 0 ? S< 03:23 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? S 03:23 0:00 [kworker/u256:0]
root 7 0.0 0.0 0 0 ? S 03:23 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 03:23 0:00 [rcu_bh]
root 9 0.1 0.0 0 0 ? S 03:23 0:00 [rcu_sched]
进程信息11个字段的含义如下:
| 表头 | 含义 |
|---|---|
| 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 -le
查看进程信息
[root@localhost ~]# ps -le|head -10
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
//14个字段信息
4 S 0 1 0 0 80 0 - 32041 ep_pol ? 00:00:00 systemd
1 S 0 2 0 0 80 0 - 0 kthrea ? 00:00:00 kthreadd
1 S 0 3 2 0 80 0 - 0 smpboo ? 00:00:00 ksoftirqd/0
1 S 0 4 2 0 80 0 - 0 worker ? 00:00:00 kworker/0:0
1 S 0 5 2 0 60 -20 - 0 worker ? 00:00:00 kworker/0:0H
1 S 0 6 2 0 80 0 - 0 worker ? 00:00:00 kworker/u256:0
1 S 0 7 2 0 -40 - - 0 smpboo ? 00:00:00 migration/0
1 S 0 8 2 0 80 0 - 0 rcu_gp ? 00:00:00 rcu_bh
1 S 0 9 2 0 80 0 - 0 rcu_gp ? 00:00:00 rcu_sched
进程信息14个字段的含义如下:
| 表头 | 含义 |
|---|---|
| F | 进程标志,说明进程的权限,常见的标志有两个: 1:进程可以被复制,但是不能被执行;4:进程使用超级用户权限; |
| S | 进程状态。具体的状态和"psaux"命令中的 STAT 状态一致; |
| UID | 运行此进程的用户的 ID; |
| PID | 进程的 ID; |
| PPID | 父进程的 ID; |
| C | 该进程的 CPU 使用率,单位是百分比; |
| PRI | 进程的优先级,数值越小,该进程的优先级越高,越早被 CPU 执行;系统定义不可以人为修改 |
| NI | 进程的优先级,数值越小,该进程越早被执行;可以人为修改 |
| ADDR | 该进程在内存的哪个位置; |
| SZ | 该进程占用多大内存; |
| WCHAN | 该进程是否运行。"-"代表正在运行; |
| TTY | 该进程由哪个终端产生; |
| TIME | 该进程占用 CPU 的运算时间,注意不是系统时间; |
| CMD | 产生此进程的命令名; |
如果不想看到所有的进程,只想查看一下当前登录产生了哪些进程,那只需使用 "ps -l" 命令就足够了
查看特定属性
[root@localhost ~]# ps axo pid,cmd,%mem,%cpu|head -10
#查看进程的特定属性
PID CMD %MEM %CPU
1 /usr/lib/systemd/systemd -- 0.3 0.1
2 [kthreadd] 0.0 0.0
3 [ksoftirqd/0] 0.0 0.0
5 [kworker/0:0H] 0.0 0.0
7 [migration/0] 0.0 0.0
8 [rcu_bh] 0.0 0.0
9 [rcu_sched] 0.0 0.0
10 [watchdog/0] 0.0 0.0
11 [watchdog/1] 0.0 0.0
[root@localhost ~]# ps -eo user,pid,ppid,%cpu,command |head -5
#查看进程的USER、PID、PPID、%CPU、COMMAND五个属性
USER PID PPID %CPU COMMAND
root 1 0 0.1 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root 2 0 0.0 [kthreadd]
root 3 2 0.0 [ksoftirqd/0]
root 5 2 0.0 [kworker/0:0H]
进程排序
[root@localhost ~]# ps aux --sort=%cpu |head -5
#按CPU占比升序排列
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2 0.0 0.0 0 0 ? S 03:23 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 03:23 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 03:23 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S 03:23 0:00 [migration/0]
top(动态查看进程)
ps 命令可以一次性给出当前系统中进程状态,但使用此方式得到的信息缺乏时效性,并且,如果管理员需要实时监控进程运行情况,就必须不停地执行 ps 命令,这显然是缺乏效率的。
为此,Linux 提供了 top 命令。top 命令可以动态地持续监听进程地运行状态,与此同时,该命令还提供了一个交互界面,用户可以根据需要,人性化地定制自己的输出,进而更清楚地了进程的运行状态。
| 选项 | 作用 |
|---|---|
| -d 秒数 | 指定 top 命令每隔几秒更新。默认是 3 秒。 |
| -b | 使用批次处理模式输出。一般和"-n"选项合用,用于把 top 命令重定向到文件中。 |
| -n 次数 | 指定 top 命令执行的次数。一般和"-"选项合用。 |
| -p 进程PID | 仅查看指定 ID 的进程。 |
| -s | 使 top 命令在安全模式中运行,避免在交互模式中出现错误。 |
| -u 用户名 | 只监听某个用户的进程 |
在 top 命令的显示窗口中,还可以使用如下按键,进行一下交互操作:
- ? 或 h:显示交互模式的帮助;
- c:按照 CPU 的使用率排序,默认就是此选项;
- M:按照内存的使用率排序;
- N:按照 PID 排序;
- T:按照 CPU 的累积运算时间排序,也就是按照 TIME+ 项排序;
- k:按照 PID 给予某个进程一个信号。一般用于中止某个进程,信号 9 是强制中止的信号;
- r:按照 PID 给某个进程重设优先级(Nice)值;
- q:退出 top 命令;
举例:
[root@localhost ~]# top -d 10 //每10秒刷新一次
[root@localhost ~]# top -d 10 -n 3 //每10秒刷新一次,只执行3次,刷5次后自动退出
[root@localhost ~]# top -p 355,689 //查看PID为355和689的进程
[root@localhost ~]# top -u zhangsan //查看zhangsan用户的进程
top命令输出内容
top 命令的输出内容是动态的,默认每隔 3 秒刷新一次。
命令的输出主要分为两部分:
- 第一部分是前五行,显示的是整个系统的资源使用状况,我们就是通过这些输出来判断服务器的资源使用状态的。
- 第二部分从第六行开始,显示的是系统中进程的信息。
[root@localhost ~]# top
top - 03:41:38 up 18 min, 1 user, load average: 0.00, 0.01, 0.01
Tasks: 150 total, 1 running, 149 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.2 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 2031912 total, 1379352 free, 294780 used, 357780 buff/cache
KiB Swap: 4194300 total, 4194300 free, 0 used. 1534148 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 128164 6824 4060 S 0.0 0.3 0:00.84 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.00 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
7 root rt 0 0 0 0 S 0.0 0.0 0:00.02 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root 20 0 0 0 0 S 0.0 0.0 0:00.07 rcu_sched
10 root rt 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/0
11 root rt 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/1
12 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/1
13 root 20 0 0 0 0 S 0.0 0.0 0:00.01 ksoftirqd/1
14 root 20 0 0 0 0 S 0.0 0.0 0:00.06 kworker/1:0
15 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/1:0H
17 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
18 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
19 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khungtaskd
20 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 writeback
第一部分
第一部分是前五行,显示的是整个系统的资源使用状况。
top - 03:41:38 up 18 min, 1 user, load average: 0.00, 0.01, 0.01
Tasks: 150 total, 1 running, 149 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.2 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 2031912 total, 1379352 free, 294780 used, 357780 buff/cache
KiB Swap: 4194300 total, 4194300 free, 0 used. 1534148 avail Mem
1.第一行是任务队列信息,具体内容如下表所示。 top - 03:41:38 up 18 min, 1 user, load average: 0.00, 0.01, 0.01
| 内容 | 说明 |
|---|---|
| 03:41:38 | 系统当前时间 |
| up 18 min | 系统的运行时间。本机已经运行 18分钟 |
| 1 user | 当前登录了一个用户 |
| load average: 0.00, 0.01, 0.01 | 系统在之前 1 分钟、5 分钟、15 分钟的平均负载。如果 CPU 是单核的,则这个数值超过 1 就是高负载:如果 CPU 是四核的,则这个数值超过 4 就是高负载 (这个平均负载完全是依据个人经验来进行判断的,一般认为不应该超过服务器 CPU 的核数) |
2.第二行是进程信息,具体内容如下表。 Tasks: 150 total, 1 running, 149 sleeping, 0 stopped, 0 zombie
| 内容 | 说明 |
|---|---|
| Tasks: 150 total | 系统中的进程总数 |
| 1 running | 正在运行的进程数 |
| 149 sleeping | 睡眠的进程数 |
| 0 stopped | 停止(暂停)的进程数 |
| 0 zombie | 僵尸进程数。如果不是 0,则需要手工检查僵尸进程。 |
3.第三行是 CPU 信息,具体内容如下表。 %Cpu(s): 0.0 us, 0.2 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
| 内容 | 说明 |
|---|---|
| %Cpu(s): 0.0 us | 用户模式占用的 CPU 百分比 |
| 0.2 sy | 系统模式占用的 CPU 百分比 |
| 0.0 ni | 改变过优先级的用户进程占用的 CPU 百分比 |
| 99.8 id | 空闲 CPU 占用的 CPU 百分比 |
| 0.0 wa | 等待输入/输出的进程占用的 CPU 百分比 |
| 0.0 hi | 硬中断请求服务占用的 CPU 百分比 |
| 0.0 si | 软中断请求服务占用的 CPU 百分比 |
| 0.0 st | st(steal time)意为虚拟时间百分比,就是当有虚拟机时,虚拟 CPU 等待实际 CPU 的时间百分比 |
4.第四行是物理内存信息,具体内容如下表。 KiB Mem : 2031912 total, 1379352 free, 294780 used, 357780 buff/cache
| 内容 | 说明 |
|---|---|
| KiB Mem : 2031912 total | 物理内存的总量,单位为KB |
| 1379352 free | 空闲的物理内存数量 |
| 294780 used | 已使用的物理内存数量 |
| 357780 buff/cache | 作为缓冲的内存数量 |
5.第五行是交换分区(swap)信息,具体内容如下表。 KiB Swap: 4194300 total, 4194300 free, 0 used. 1534148 avail Mem
| 内容 | 说明 |
|---|---|
| KiB Swap: 4194300 total | 交换分区(虚拟内存)的总大小,单位KB |
| 4194300 free | 空闲交换分区的大小 |
| 0 used. | 已使用的交换分区的大小 |
| 1534148 avail Mem | 可用于进程下一次分配的物理内存数量 |
根据第一部分判断服务器健康状况:
通过 top 命令的第一部分就可以判断服务器的健康状态。如果 1 分钟、5 分钟、15 分钟的平均负载高于 1,则证明系统压力较大。如果 CPU 的使用率过高或空闲率过低,则证明系统压力较大。如果物理内存的空闲内存过小,则也证明系统压力较大。
这时,我们就应该判断是什么进程占用了系统资源。如果是不必要的进程,就应该结束这些进程;如果是必需进程,那么我们该増加服务器资源(比如増加虚拟机内存),或者建立集群服务器。
缓冲(buffer)和缓存(cache)的区别:
- 缓存(cache)是在读取硬盘中的数据时,把最常用的数据保存在内存的缓存区中,再次读取该数据时,就不去硬盘中读取了,而在缓存中读取。
- 缓冲(buffer)是在向硬盘写入数据时,先把数据放入缓冲区,然后再一起向硬盘写入,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。
简单来说,缓存(cache)是用来加速数据从硬盘中"读取"的,而缓冲(buffer)是用来加速数据"写入"硬盘的。
第二部分
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 -l "log"
# 显示进程名
421 xfs-log/dm-0
660 xfs-log/sda1
668 xfs-log/sdb1
734 rsyslogd
738 systemd-logind
742 abrt-watch-log
744 abrt-watch-log
prtstat命令(查看指定的进程)
-r :格式显示
[root@localhost ~]# prtstat -r 1121
Process with pid 1121 does not exist.
[root@localhost ~]# prtstat -r 660
pid: 660 comm: xfs-log/sda1
state: S ppid: 2
pgrp: 0 session: 0
tty_nr: 0 tpgid: -1
flags: 420a060 minflt: 0
cminflt: 0 majflt: 0
cmajflt: 0 utime: 0
stime: 0 cutime: 0
cstime: 0 priority: 0
nice: -20 num_threads: 1
itrealvalue: 0 starttime: 223
vsize: 0 rss: 0
rsslim: 18446744073709551615 startcode: 0
endcode: 0 startstack: 0
kstkesp: 0 kstkeip: 0
wchan: 18446744071579536894 nswap: 0
cnswap: 18446744071579536894 exit_signal: 17
processor: 0 rt_priority: 0
policy: 0 delayaccr_blkio_ticks: 0
guest_time: 0 cguest_time: 0
pstree命令(树形结构列出进程信息)
| 选项 | 作用 |
|---|---|
| -a | 显示启动每个进程对应的完整指令,包括启动进程的路径、参数等。 |
| -p | 显示PID |
| -p < pid> | 显示指定进程及其子进程,同时显示每个进程的PID |
| -u | 显示进程的用户名称 |
| -u 用户名 | 显示指定用户的进程。 |
| -H < pid> | 高亮显示指定进程及其前辈进程 |
| -T | 不显示线程thread,默认显示线程 |
[root@localhost ~]# pstree 660
xfs-log/sda1
lsof命令(列举被打开的文件)
| 选项 | 作用 |
|---|---|
| -c 字符串 | 只列出以字符串开头的进程打开的文件。 |
| +d 目录名 | 列出某个目录中所有被进程调用的文件。 |
| -u 用户名 | 只列出某个用户的进程打开的文件。 |
| -p pid | 列出某个 PID 进程打开的文件。 |
[root@localhost ~]# lsof | more
#查询系统中所有进程调用的文件
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,0 236 64 /
systemd 1 root rtd DIR 253,0 236 64 /
systemd 1 root txt REG 253,0 1523568 33924706 /usr/lib/systemd/system
d
systemd 1 root mem REG 253,0 20040 265152 /usr/lib64/libuuid.so.1
.3.0
systemd 1 root mem REG 253,0 261336 562399 /usr/lib64/libblkid.so.
1.1.0
systemd 1 root mem REG 253,0 90664 265137 /usr/lib64/libz.so.1.2.
7
systemd 1 root mem REG 253,0 157424 265233 /usr/lib64/liblzma.so.5
.2.2
systemd 1 root mem REG 253,0 23968 265314 /usr/lib64/libcap-ng.so
.0.0.0
systemd 1 root mem REG 253,0 19888 265622 /usr/lib64/libattr.so.1
.1.0
systemd 1 root mem REG 253,0 19776 215859 /usr/lib64/libdl-2.17.s
o
systemd 1 root mem REG 253,0 402384 265124 /usr/lib64/libpcre.so.1
.2.0
vmstat命令(监控系统资源)
如果你想动态的了解一下系统资源的使用状况,以及查看当前系统中到底是哪个环节最占用系统资源,就可以使用 vmstat 命令。
vmstat命令,是 Virtual Meomory Statistics(虚拟内存统计)的缩写,可用来监控 CPU 使用、进程状态、内存使用、虚拟内存使用、硬盘输入/输出状态等信息。
| 选项 | 作用 |
|---|---|
| -fs | -f:显示从启动到目前为止,系统复制(fork)的程序数,此信息是从 /proc/stat 中的 processes 字段中取得的。 -s:将从启动到目前为止,由一些事件导致的内存变化情况列表说明。 |
| -S 单位 | 令输出的数据显示单位,例如用 K/M 取代 bytes 的容量。 |
| -d | 列出硬盘有关读写总量的统计表。 |
| -p 分区设备文件名 | 查看硬盘分区的读写情况。 |
[root@localhost ~]# vmstat 1 3
#使用vmstat检测,每隔1秒刷新一次,共刷新3次
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 1371048 2224 363676 0 0 55 2 34 37 0 0 100 0 0
0 0 0 1371048 2224 363708 0 0 0 0 57 51 0 0 100 0 0
0 0 0 1371048 2224 363708 0 0 0 0 44 38 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 百分比 |
启动进程
手动启动
- 前台启动:通过终端启动,且启动后一直占据终端
- 后台启动:可通过终端启动,但启动后即转入后台运行(释放终端)
&(后台执行)
让作业运行于后台
- 运行中的作业: Ctrl+z
- 尚未启动的作业: COMMAND &
[root@localhost ~]# cp -r /data/* /opt/ &
[1] 2224
jobs(查看后台任务列表)
[root@localhost ~]#jobs
[1]- Stopped cp -i -r /data/* /opt/
[2]+ Stopped top
bg(继续任务)
[root@localhost ~]# dd if=/dev/zero of=/data/aa/f1 bs=1G count=10
^Z
[1]+ 已停止 dd if=/dev/zero of=/data/aa/f1 bs=1G count=10
[root@localhost ~]# jobs //查看后台任务列表,任务是停止状态
[1]+ 已停止 dd if=/dev/zero of=/data/aa/f1 bs=1G count=10
[root@localhost ~]# bg 1 //让暂停的后台任务,变成继续执行
[1]+ dd if=/dev/zero of=/data/aa/f1 bs=1G count=10 &
[root@localhost ~]# jobs //查看任务列表,进程是运行状态
[1]+ 运行中 dd if=/dev/zero of=/data/aa/f1 bs=1G count=10 &
结束进程
kill
kill [信号] PID
| 信号编号 | 信号名 | 含义 |
|---|---|---|
| 0 | EXIT | 程序退出时收到该信息。 |
| 1 | HUP | 挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化。 |
| 2 | INT | 表示结束进程,但并不是强制性的,常用的 "Ctrl+C" 组合键发出就是一个 kill -2 的信号。 |
| 3 | QUIT | 退出。 |
| 9 | KILL | 杀死进程,即强制结束进程。 |
| 11 | SEGV | 段错误。 |
| 15 | TERM | 正常结束进程,是 kill 命令的默认信号。 |
| 18 | CONT | 继续 |
| 19 | STOP | 暂停 |
killall
killall [选项] [信号] 进程名
- -i:交互式,询问是否要杀死某个进程;
- -I:忽略进程名的大小写;
pkill
pkill [信号] 进程名
| 信号编号 | 信号名 | 含义 |
|---|---|---|
| 0 | EXIT | 程序退出时收到该信息。检查 进程是否有故障 |
| 1 | HUP | 挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化。 |
| 2 | INT | 表示结束进程,但并不是强制性的,常用的 "Ctrl+C" 组合键发出就是一个 kill -2 的信号。 |
| 3 | QUIT | 退出。 |
| 9 | KILL | 杀死进程,即强制结束进程。 |
| 11 | SEGV | 段错误。 |
| 15 | TERM | 正常结束进程,是 kill 命令的默认信号。 |
进程的优先级设置
进程优先级os
每个CPU在一个时间点上只能处理一个进程,通过时间分片技术,来同时运行多个进程。每个进程都有相应的优先级,优先级决定它何时运行和接收多少 CPU 时间。
在 Linux 系统中,表示进程优先级的有两个参数:Priority 和 Nice。数值越小,优先级越高,该进程越优先被 CPU 处理。
不过,PRI值是由内核动态调整的,用户不能直接修改。所以我们只能通过修改 NI 值来影响 PRI 值,间接地调整进程优先级。
PRI (最终值) = PRI (原始值) + NI
修改 NI 值时有几个注意事项:
- NI 范围是 -20~19。
- 普通用户调整 NI 值的范围是 0~19,而且只能调整自己的进程。
- 普通用户只能调高 NI 值,而不能降低。如原本 NI 值为 0,则只能调整为大于 0。
- 只有 root 用户才能设定进程 NI 值为负值,而且可以调整任何用户的进程。
nice(启动具有不同nice级别的进程)
nice -n 优先级 命令
#将程序停止
# ps -ef |grep crond
# kill PID
或
# systemctl stop crond
#启动并制定优先级
# nice -n -10 crond
#确认优先级
# ps -ef |grep crond
PID
# top -p PID
renice(更改现有进程的nice级别)
renice -n 优先级 -p PID //修改现有进程的nice级别
[root@localhost ~]# top -p 4657 //查看68219进程的nice级别,为0
[root@localhost ~]# renice -n -10 -p 4657 //将68219进程的nice级别修改为-10
68219 (进程 ID) 旧优先级为 0,新优先级为 -10
[root@localhost ~]# top -p 4657 //修改后的nice级别为-10
计划任务
at(一次性任务设置)
at 工具
- 由包 at 提供
- 依赖与atd服务,需要启动才能实现at任务
- at队列存放在/var/spool/at目录中,ubuntu存放在/var/spool/cron/atjobs目录下
- 执行任务时PATH变量的值和当前定义任务的用户身份一致
at 命令的访问控制是依靠 /etc/at.allow(白名单)和 /etc/at.deny(黑名单)这两个文件来实现的,具体规则如下:
- 如果系统中有 /etc/at.allow 文件,那么只有写入 /etc/at.allow 文件(白名单)中的用户可以使用 at 命令,其他用户不能使用 at 命令(注意,/etc/at.allow 文件的优先级更高,也就是说,如果同一个用户既写入 /etc/at.allow 文件,又写入 /etc/at.deny 文件,那么这个用户是可以使用 at 命令的)。
- 如果系统中没有 /etc/at.allow 文件,只有 /etc/at.deny 文件,那么写入 /etc/at.deny 文件(黑名单)中的用户不能使用 at 命令,其他用户可以使用 at 命令。不过这个文件对 root 用户不生效。
- 如果系统中这两个文件都不存在,那么只有 root 用户可以使用 at 命令。
系统中默认只有 /etc/at.deny 文件,而且这个文件是空的,因此,系统中所有的用户都可以使用 at 命令。不过,如果我们打算控制用户的 at 命令权限,那么只需把用户写入 /etc/at.deny 文件即可
at [选项] [时间]
at [HH:MM] [yyyy-mm-dd]
时间格式说明:
| 格式 | 用法 |
|---|---|
| HH:MM | 比如 04:00 AM。如果时间已过,则它会在第二天的同一时间执行。 |
| Midnight(midnight) | 代表 12:00 AM(也就是 00:00)。 |
| Noon(noon) | 代表 12:00 PM(相当于 12:00)。 |
| Teatime(teatime)下午茶 | 代表 4:00 PM(相当于 16:00)。 |
| 英文月名 日期 年份 | 比如 January 15 2018 表示 2018 年 1 月 15 号,年份可有可无。 |
| MMDDYY、MM/DD/YY、MM.DD.YY | 比如 011518 表示 2018 年 1 月 15 号。 |
| now+时间 | 以 minutes、hours、days 或 weeks 为单位,例如 now+5 days 表示命令在 5 天之后的此时此刻执行。 |
示例:
[root@localhost ~]# at 20:00 2022-10-9 //在2022年10月9日20:00执行任务
at> touch /tmp/test/1.txt //设置具体任务,在/tmp/test 目录下创建文件
at> <EOT> //按ctrl+d 提交任务
job 5 at Sun Oct 10 20:00:00 2022 //任务已成功设置
[root@localhost ~]# atq //查看at任务列表
5 Sun Oct 10 20:00:00 2022 a root
crontab(周期性任务设置)
crontab [选项] [file]
| 选项 | 功能 |
|---|---|
| -u user | 用来设定某个用户的 crontab 服务,例如 "-u demo" 表示设备 demo 用户的 crontab 服务,此选项一般有 root 用户来运行。 |
| -e | 编辑某个用户的 crontab 文件内容。如果不指定用户,则表示编辑当前用户的 crontab 文件。 |
| -l | 显示某用户的 crontab 文件内容,如果不指定用户,则表示显示当前用户的 crontab 文件内容。 |
| -r | 从 /var/spool/cron 删除某用户的 crontab 文件,如果不指定用户,则默认删除当前用户的 crontab 文件。 |
| -i | 在删除用户的 crontab 文件时,给确认提示。 |
[root@localhost ~]# cat /etc/crontab
#查看/etc/crontab文件
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
使用 "crontab -e" 进入 crontab 编辑界面。会打开vim编辑你的任务,输入格式为:
* * * * * 执行的任务
不同*的含义
| 项目 | 含义 | 范围 |
|---|---|---|
| 第一个"*" | 一小时当中的第几分钟(minute) | 0~59 |
| 第二个"*" | 一天当中的第几小时(hour) | 0~23 |
| 第三个"*" | 一个月当中的第几天(day) | 1~31 |
| 第四个"*" | 一年当中的第几个月(month) | 1~12 |
| 第五个"*" | 一周当中的星期几(week) | 0~7(0和7都代表星期日) |
不同特殊符号的含义
| 特殊符号 | 含义 |
|---|---|
| *(星号) | 代表任何时间。比如第一个"*"就代表一小时种每分钟都执行一次的意思。 |
| ,(逗号) | 代表不连续的时间。比如"0 8,12,16***命令"就代表在每天的 8 点 0 分、12 点 0 分、16 点 0 分都执行一次命令。 |
| -(中杠) | 代表连续的时间范围。比如"0 5 ** 1-6命令",代表在周一到周六的凌晨 5 点 0 分执行命令。 |
| /(正斜线) | 代表每隔多久执行一次。比如"/10***命令",代表每隔 10 分钟就执行一次命令。 |
示例
0 17 * * 1-5 //周一到周五每天17:00
30 8 * * 1,3,5 //每周一、三、五的8:30
0 8-18/2 * * * //8点到18点之间每2小时
0 * */3 * * //每3天的每个整点
在书写 crontab 定时任务时,需要注意以下几个事项:
- 6 个选项都不能为空,必须填写。如果不确定,则使用“*”代表任意时间。
- crontab 定时任务的最小有效时间是分钟,最大有效时间是月。像 2018 年某时执行、3 点 30 分 30 秒这样的时间都不能被识别。
- 在定义时间时,日期和星期最好不要在一条定时任务中出现,因为它们都以天为单位,非常容易让管理员混淆。
- 在定时任务中,不管是直接写命令,还是在脚本中写命令,最好都使用绝对路径。有时使用相对路径的命令会报错。