1. 进程
什么是进程
进程是运行中的程序的一个副本,是被载入内存的一个指令集合,是资源分配的单位。
特点:
- 动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的;
- 并发性:任何进程都可以同其他进程一起并发执行;
- 独立性:进程是系统进行资源分配和调度的一个独立单位;
- 结构性:进程由程序、数据和进程控制块三部分组成
2. 进程和内存
2.1 进程使用中常见的问题
- 内存泄漏(Memory Leak):指程序中用malloc或new申请了一块内存,但是没有用free或delete将内存释放,导致这块内存一直处于占用状态。
- 内存溢出(Memory Overflow):指程序申请了10M的空间,但是在这个空间写入10M以上字节的数据,就是溢出。
- 内存不足(OOM):Out Of Memory,“内存用完了”,在情况在java程序中比较常见。系统会选一个进程将之杀死,在日志messages中看到类似下面的提示。
Jul 10 10:20:30 kernel: Out of memory: Kill process 9527 (java) score 88 or sacrifice child
当JVM因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出这个error,因为这个问题已经严重到不足以被应用处理
2.2 进程状态
- 创建状态:进程在创建时需要申请一个空白PCB(process control block进程控制块),向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态
- 就绪状态:进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行
- 执行状态:进程处于就绪状态被调度后,进程进入执行状态
- 阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用
- 终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行
3.进程管理的相关命令
3.1 ps命令
ps axu # 查看静态的进程信息
ps aux --sort %cpu #以cpu 利用率排序
ps aux --sort -%cpu #以cpu 利用率倒叙排序
ps aux --sort -%mem #以内存 利用率倒序排序
3.2 prtstat命令
prtstat + pid号 #查看进程详细信息
3.3 top命令
- top命令:查看动态的进程排名信息
- 按P按照cpu排序,M按照内存排序
- 按q或ctrl+c退出当前页面
#top选项:
-d # 指定刷新时间间隔,默认为3秒
-b #全部显示所有进程
-n # 刷新多少次后退出
3.4 pgrep命令
查看指定的进程
- -U 指定用户 小u 也可以
- -l: 显示进程名
- -a: 显示完整格式的进程名
- -P pid: 显示指定进程的子进程
3.4.1 pidof
已知程序名不知道pid号
[root@localhost ~]# pidof nginx
#查看 nginx进程的 pid 号
22142 22002
3.5 pstree命令
以树形结构列出进程信息
格式:pstree [选项] [pid / 用户]
- 常用选项
-a #显示启动每个进程对应的完整指令,包括启动进程的路径、参数等
-p #显示PID
-T #不显示线程thread,默认显示线程
-u #显示用户切换
-H pid #高亮显示指定进程及其前辈进程
3.6 lsof
lsof 命令,“list opened files”的缩写,直译过来,就是列举系统中已经被打开的文件。
lsof [选项]
| 选项 | 功能 |
|---|---|
| -c 字符串 | 只列出以字符串开头的进程打开的文件。 |
| +d 目录名 | 列出某个目录中所有被进程调用的文件。 |
| -u 用户名 | 只列出某个用户的进程打开的文件。 |
| -p pid | 列出某个 PID 进程打开的文件。 |
| -i |
3.7 监控系统资源vmstat命令
vmstat命令,是 Virtual Meomory Statistics(虚拟内存统计)的缩写,可用来监控 CPU 使用、进程状态、内存使用、虚拟内存使用、硬盘输入/输出状态等信息。
格式:vmstat [选项]
| 选项 | 含义 |
|---|---|
| -fs | -f:显示从启动到目前为止,系统复制(fork)的程序数,此信息是从 /proc/stat 中的 processes 字段中取得的。 -s:将从启动到目前为止,由一些事件导致的内存变化情况列表说明。 |
| -S 单位 | 令输出的数据显示单位,例如用 K/M 取代 bytes 的容量。 |
| -d | 列出硬盘有关读写总量的统计表。 |
| -p 分区设备文件名 | 查看硬盘分区的读写情况。 |
3.8 内存free命令
查看内存相关信息 格式:free [选项]
free -h #人性化显示
free -m #以m为单位查看
echo 3 > /proc/sys/vm/drop_caches #清除缓存
pmap 1073 #查看进程占用 内存的详细信息
3.9 iostat命令
iostat 可以提供更丰富的IO性能状态数据(此工具由sysstat包提供)。
格式:iostat [选项]
常用选项:
-c #只显示CPU行
-d #显示设备〈磁盘)使用状态
-k #以千字节为为单位显示输出
-t #在输出中包括时间戳
-x #在输出中包括扩展的磁盘指标
4. 把命令放入后台执行
4.1 让命令运行于后台
- 运行中的作业: Ctrl+z 放到后台 但是会停止作业
- 尚未启动的作业: COMMAND &
- 第一种把命令放入后台的方法是在命令后面加入
空格 &。使用这种方法放入后台的命令,在后台处于执行状态。
注意,放入后台执行的命令不能与前台有交互,否则这个命令是不能在后台执行的
5. 结束进程
5.1 kill
kill 命令只是用来向进程发送一个信号,至于这个信号是什么,是用户指定的。
**格式:kill [信号] PID **
| 信号编号 | 信号名 | 含义 |
|---|---|---|
| 0 | EXIT | 程序退出时收到该信息。 |
| 1 | HUP | 挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化。 |
| 2 | INT | 表示结束进程,但并不是强制性的,常用的 "Ctrl+C" 组合键发出就是一个 kill -2 的信号。 |
| 3 | QUIT | 退出。 |
| 9 | KILL | 杀死进程,即强制结束进程。 |
| 11 | SEGV | 段错误。 |
| 15 | TERM | 正常结束进程,是 kill 命令的默认信号。 |
6.计划任务
6.1 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 文件时,给确认提示。 |
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 分钟就执行一次命令。 |
在书写 crontab 定时任务时,需要注意以下几个事项:
- 6 个选项都不能为空,必须填写。如果不确定,则使用“*”代表任意时间。
- crontab 定时任务的最小有效时间是分钟,最大有效时间是月。像 2018 年某时执行、3 点 30 分 30 秒这样的时间都不能被识别。
- 在定义时间时,日期和星期最好不要在一条定时任务中出现,因为它们都以天为单位,非常容易让管理员混淆。
- 在定时任务中,不管是直接写命令,还是在脚本中写命令,最好都使用绝对路径。有时使用相对路径的命令会报错。