文章目录
- 一、进程管理
- 1.1 进程管理概念
- 1.2 查看进程信息
- 1.2.1 ps命令------静态查看进程信息
- 方法一:ps -aux
- 方法二:ps -elf
- ps命令结合管道符
- 1.2.2 top命令------动态查看进程信息
- top查看结果解释
- 操作技巧
- 1.2.3 pgrep命令
- 1.2.4 jobs命令
- 1.3 结束进程
- 1.3.1 kill命令
- 1.3.2 僵尸进程
- 小问题
- 1.4 运维的指标:五大负载
- 二、定时任务、计划任务
- 2.1 crontab命令
- 2.2 定时任务文本格式
一、进程管理
1.1 进程管理概念
进程管理相当于任务管理器。
程序是一串没有运行的代码,进程是运行起来的代码。
线程:线程相当于复制了进程的部分代码,程序运行起来之后,真正执行的是线程。
Linux系统当中启动程序的过程
父进程先启动。------子进程的资源由父进程来进行分配。
结束的过程:
子进程先结束。------父进程收回子进程的资源。------父进程终止。
特殊情况:
父进程结束了,子进程还在。------僵尸进程。资源无人回收。
1.2 查看进程信息
查看进程信息分为静态查看,动态查看。
1.2.1 ps命令------静态查看进程信息
方法一:ps -aux
ps -a :all,显示终端上的所有进程,包括其他用户的进程
ps -u :user,显示进程的执行用户。
ps -x :显示当前终端进程的详细信息。
ps --sort :按照列名排序
ps -aux :主要用来查看进程占用系统资源的情况。
ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.1 0.1 193816 6888 ? Ss 21:25 0:01 /usr/lib/systemd/system
root 2 0.0 0.0 0 0 ? S 21:25 0:00 [kthreadd]
ps -aux 查看结果首行字段的解释:
- USER:进程的用户
- PID:进程号,每个进程在系统中运行的唯一标识,每个PID都是不重复的。
- %CPU:进程占用CPU的百分比
- %MEM:进程占用物理内存的百分比
- VSZ:进程使用的虚拟内存的大小,单位KB
- RSS:进程占用物理内存的量,单位KB
- TTY:表示终端。?表示该进程不是由终端启动的
- STAT: status,进程的状态
- S:处于休眠状态,随时可唤醒。
- D:处于不可中断的休眠状态。
- R:运行状态。
- T:停止状态,后台进程暂停或者进程处于跟踪调试状态。
- Z:僵尸进程。父进程结束了子进程还在。
- s :该进程包含子进程
- < :该进程优先级高
- N :低优先级
- l :该进程由多个线程
- L :该进程有一部分被锁进内存
- + :该进程位于前台运行
- START:进程启动的时间
- TIME:进程实际使用CPU运行的时间
- COMMAND:进程启动的命令
方法二:ps -elf
ps -e :显示系统内的所有进程
ps -l :显示进程的详细信息
ps -f :完整的显示进程的信息
ps -elf :也是静态查看
ps -elf 查看结果首行字段的解释:
- F:内核分配给进程的系统标识
- S:status,进程的状态
- UID:该进程的用户
- PID:该进程的进程号
- PPID:该进程的父进程进程号
- C:表示进程在生命周期当中的CPU利用率
- PRI:优先级,数值越大优先级越低
- NI:谦让值,PRI - NI 是最终优先级
- ADDR:进程在内存当中的地址
- SZ:交换空间,假如进程被换出,需要的交换空间大小
- WCHAN:如果进程处于休眠状态,显示睡眠中的系统函数名
- STIME:进程启动的时间
- TIME:进程实际使用CPU运行的时间
- CMD:command,进程启动的命令
ps命令结合管道符
例:ps结合grep查看指定进程:查看nginx服务进程状态
systemctl restart nginx
ps -aux | grep nginx
root 11216 0.0 0.0 39308 940 ? Ss 22:25 0:00 nginx: master process /usr/sbin/nginx
nginx 11217 0.0 0.0 41780 1960 ? S 22:25 0:00 nginx: worker process
nginx 11218 0.0 0.0 41780 1960 ? S 22:25 0:00 nginx: worker process
root 11222 0.0 0.0 112708 976 pts/0 S+ 22:26 0:00 grep --color=auto nginx
#最后一个是grep的进程,表示对查到的nginx结果着色显示,实际有两个子进程
例:查看CPU/内存占用率最高的进程
使用 --sort
排序是,- 表示降序,+ 表示升序
ps -aux --sort=-pcpu | head -11
#展示占用CPU排名前10的进程。(标题也算1行,所以head -11)
ps -aux --sort=-pmem | head -11
#展示占用内存排名前10的进程。
1.2.2 top命令------动态查看进程信息
top查看结果解释
第一行:top - 23:03:47 up 1:38, 2 users, load average: 0.00, 0.01, 0.05
- 23:03:47 :系统时间
- up 1:38 :系统运行的时长
- 2 users :当前登录系统的用户
- load average :系统的负载:三个数字分别为系统1分钟、5分钟、15分钟内处理的任务数的平均值。
第二行:Tasks: 193 total, 1 running, 192 sleeping, 0 stopped, 0 zombie
进程信息:进程总数193,1个运行,192个休眠,0个终止,0个僵尸
第三行:%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
- CPU信息
- us :系统用户占用CPU的百分比
- sy :内核占用CPU的百分比
- ni :优先级调度占用的CPU
- id :当前系统CPU空闲的百分比
- wa :磁盘的读写性能
- hi :1分钟内CPU的使用率
- si :5分钟内CPU的使用率
- st :15分钟内CPU的使用率
第四行:KiB Mem : 3861508 total, 2753368 free, 412208 used, 695932 buff/cache
第五行:KiB Swap: 4063228 total, 4063228 free, 0 used. 3147044 avail Mem
**第四行 + 第五行 = free -h
,查看内存使用情况
进程信息区各列的作用
- PID:进程号
- USER:用户
- PR:优先级
- NI:谦让值
- VIRT:进程使用的虚拟内存,单位KB
- RES:进程使用的物理内存,单位KB
- SHR:共享内存大小
- S:进程状态
- %CPU:动态显示进程占用CPU的百分比
- %MEN:动态显示进程占用物理内存的百分比
- TIME+:进程使用CPU的时间总计,单位1/100秒
- COMMAND:进程启动的命令
操作技巧
数字1键:展示CPU个数和使用情况
c键:根据CPU占用量的百分比大小,从大到小排序
q键:退出top
命令 top -b -n 1:运行一次之后立刻退出top,相当于静态查看ps。
1.2.3 pgrep命令
pgrep -选项 进程名 ------格式
pgrep :查找PID,可以配合kill一起使用,结束进程。
pgrep -a :显示进程名和PID号
pgrep -c :仅显示匹配进程的数量,不显示其他内容
pgrep -f :匹配进程名以及参数
pgrep -a nginx
11216 nginx: master process /usr/sbin/nginx
1.2.4 jobs命令
jobs :显示位于后台的进程
jobs -l :列出所有后台进程的PID号,进程名(常用)
jobs -p :列出所有后台进程的组PID
jobs -n :仅显示最近被放到后台的进程(运行中的进程)
jobs -r :仅显示正在运行的后台进程
jobs -s :仅显示已经停止的后台进程
如何把运行的程序调度到后台:
在命令行的结尾加“&
”符号,就是把进程调度到后台运行。
fg
命令可以把后台的任务调度到前台。fg + 后台任务序号
(通过jobs查看)
1.3 结束进程
1.3.1 kill命令
kill -9 :立即强制结束该进程(掌握这一个即可)
kill -9 PID(进程号) ————结束进程
kill -9 不能强制结束僵尸进程。
1.3.2 僵尸进程
制造一个僵尸进程并观察
vim wait.c #创建一个c文件,内容如下
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>int main(int argc, char **argv)
{pid_t pid;pid = fork();if (pid == 0) { // childprintf("child pid = %d\n", getpid());printf("in child...\r\n");sleep(2);} else if (pid > 0) { // fathersleep(15); /* 子进程 2s 钟后提前结束,等待父进程回收其资源,在这期间,子进程处于僵尸状态 */wait(NULL);}
在终端输入命令:
gcc wait.c -o wait.out #执行 wait.c 输出 wait.out
./wait.out #获取僵尸进程pid
child pid = 11555
另开一个终端,抓取僵尸进程
ps -elf | grep 11555
1 Z root 11555 11554 0 80 0 - 0 do_exi 22:52 pts/0 00:00:00 [wait.out] <defunct> #此即为僵尸进程,类型Z
0 S root 11557 11512 0 80 0 - 28177 pipe_w 22:52 pts/1 00:00:00 grep --color=auto 11555
小问题
问:kill命令结束进程,是谁来结束进程?命令还是系统?
答:kill只是传递一个信号——要结束进程,由系统来将进程结束。
问:如果有僵尸进程,怎么处理?
答:少量的僵尸进程影响不大,因为僵尸进程所占的系统资源很少,可以忽略。
僵尸进程数量过多时,重启。
1.4 运维的指标:五大负载
-
CPU负载:监控CPU的使用率。 工具:top,htop(top的升级版,epel源下载)。了解CPU是否过载,85%注意,90%告警。
-
内存负载:监控内存。 工具:free,top。内存占用比90%告警。优化:关闭不需要的服务;释放缓存。
-
echo 1 > /proc/sys/vm/drop_caches #清除缓存的命令
-
磁盘负载:I/O,磁盘的读写性能。 工具:iostat
-
网络负载:带宽的利用率,流量的使用情况。工具:iftop(epel源下载),ifconfig。
-
进程负载:监控进程使用资源情况。工具:top,ps。
二、定时任务、计划任务
2.1 crontab命令
crontab -e :创建定时任务,默认当前用户执行
crontab -e -u :+用户名,可以指定用户执行定时任务
crontab -l -u :展示指定用户的定时任务
crontab -r :全部清空定时任务(不要用-r !需要编辑定时任务用 -e 进入文本编辑)
2.2 定时任务文本格式
* * * * * 命令/可执行脚本 ------定时格式
5个 * 位置分别表示 分,时,日,月,周几
时间范围(整数):分:0-59 ;时:0-23 ;日:1-31 ;月:1-12 ;周:0-7 ,0和7都表示周日
当 * 不指定具体数值的时候表示该范围内的任意时间都执行;
任一个 * 的位置可以用 “ , ” 在数字中作间隔,表示多个不连续的时间点;
任一个 * 的位置可以用 “ - ” 在数字中作间隔,表示连续的时间范围;
任一个 * 的位置可以用 “ */ ” 后接数字,表示间隔的频率。
# 定时任务举例
* 8 * * * ls #每天8点的每一分钟,执行一次ls
10,30,50 8 * * * ls #每天,8点10分,30分,50分执行一次ls
30 13-16 * * 5 ls #每周五,13-16点30分,执行一次ls
0 */2 * * 1 ls #每周一,每隔2小时,在0分时执行一次ls
在定时后一般接可执行脚本。