一、进程管理基础知识
1、应用程序、系统、内核、Lib库、硬件之间的关系:
在Linux上,应用程序都是对Kernel内核或者Libraries库调用实现应用程序功能的
应用程序运行在用户和内核之间,实现用户空间和内核空间之间的交互
(用户指令、内核或库调用、内核特权指令)
内核负责进程管理、文件系统管理、网络功能、内存管理、驱动管理、安全、硬件管理...
2、进程:Process
进程是运行起来的程序中的一个副本,使用内存及CPU进行库、内核的调用等运算操作,是一个动态的实体,而程序则时一个静态的文件。
3、进程的特性:
存在声明周期
有自己的元数据:进程运行时间、PID、进程发起者...
4、Linu系统启动流程:
(01、上电开机,BIOS自检
(02、磁盘引导MBR
(03、grub引导菜单(Boot Loader)
(04、加载Kernel及必要组建
(05、启动init进程,依据inittab设定运行级别
(06、init进程,执信rc.sysinit文件
(07、启动内核模块,执信不同级别的脚本程序
(08、执行/etc/rc.d/rc.loacl
(09、启动mingetty,进入系统登陆界面
5、进程优先级0--139:
1--99:实时优先级(数字越大优先级越高)
100--139:静态优先级(数字越小优先级越高)
Nice值:-20--19可以通过调整Nice值调整进程的静态优先级(对应静态优先级)
优先级=nice+120
6、进程队列
等待队列:等待运行的队列
过期队列:运行过的队列,等待队列运行完成后才能再次被运行调度
7、进程类型:
守护进程:daemon,由内核在系统引导过程中启动的进程
用户进程(前台进程):通过终端启动的进程
8、进程的状态:
运行状态:running
就绪准太:ready
睡眠状态:
可中断睡眠状态:interruptable,可随时启动
不可终端睡眠状态:uninterruptabl,不能被启动
停止状态:stopped,暂停在内存中,但不会被调用,除非手动启动
僵死状态:zombie
9、线程:一个进程可以分为多个线程运行
10、常用进程管理工具
pstree # 进程树查看工具
ps # 进程状态查看工具
pgrep # 进程状态过滤显示命令
pidof # 根据进程名获取PID
top # 进程动态信息查看
htop # 进程动态信息查看(top升级版,支持鼠标操作)
kill # 进程控制命令,通过向进程发送控制信号控制进程状态
nice、renice # 进程优先级的调整
fuser # 查看占用指定文件或者端口的进程
11、作业:为实现同一个项目的多组进程
前台作业:运行时占据了终端的命令行窗口的作业
后台作业:运行时后台运行,不占用终端的作业
二、pstree:进程树查看工具(yum install -y psmisc)
pstree 选项 pid
常用选项
-a # 显示该行程的完整指令及参数
-c # 如果有重覆的行程名, 则分开列出(默认会在前面加上 *)
-apnh # 显示进程间的关系
-u # 显示用户名称
示例:
[oneapm@ONEAPM-NGINX01 ~]$ pstree -apnhu 97712
nginx,97712,oneapm
├─nginx,97713
├─nginx,97714
└─nginx,97715
三、ps:进程状态查看工具
ps 选项
常用选项
u # 以当前用户为中心组织进程状态信息
a # 显示与终端相关的进程
x # 显示与终端无关的进程
ax # 显示所有进程
Z # 显示安全相关信息
-e # 显示所有进程,相当于ax
-f # 显示完整格式的进程信息
-F # 显示更加完整格式的进程信息
-H # 显示进程树关系(子进程及父进程关系)
-j # 以任务格式显示
-U # 指定以某个用户身份运行的进程(-U root)
-o # 自定义显示字段
-o euser,ruser,fuser,f,comm,label,tty,pid,ppid,psr,tid,class,rtprio,ni,pri,
-o psr,pcpu,stat,wchan:14,euid,ruid,tpgid,sess,pgrp
常用字段:
ni nice值
pri priority,优先级
psr processor,使用的是那颗CPU
rtptrio 实时优先级
euid 有效用户
ruid 实际用户
pid 进程
ppid 父进程
显示字段说明:
USER(属主):进程的属主
PID(进程号):process id,进程的ID
PPID(父进程号):进程的夫进程号
%CPU(CPU占用率):该进程占用的cpu
%MEM(内存占用率):该进程占用的内存
VSZ(虚拟内存集):Virtual memory SiZe,虚拟内存大小
RSS(常驻内存集):常驻内存,固定占用,不能用于动态交换
TTY(终端):进程的终端(?表示与终端无关)
SATA(进程状态):
R running
S interruptable sleeping
D uninterruptable sleeping
T stopped
Z zombie
+ 用户进程
l 多线程进程
N 低优先级进程
< 高优先级进程
s session leader会话领导进程
(该进程启动会引导其它进程启动,终止该进程,着领导启动的进程也会终止)
常见用法示例;
[oneapm@ONEAPM-NGINX01 ~]$ ps -U oneapm -FH
UID PID PPID C SZ RSS PSR STIME TTY TIME CMD
oneapm 26506 26497 0 40870 2416 2 15:34 ? 00:00:00 sshd: oneapm@pts/4
oneapm 26507 26506 0 29217 3584 2 15:34 pts/4 00:00:00 -bash
oneapm 29704 26507 0 38830 1864 0 15:45 pts/4 00:00:00 ps -U oneapm -FH
oneapm 21837 21831 0 40870 2560 1 15:15 ? 00:00:00 sshd: oneapm@pts/3
oneapm 21838 21837 0 29189 3356 3 15:15 pts/3 00:00:00 -bash
oneapm 21895 21838 1 30726 2604 2 15:15 pts/3 00:00:29 htop
oneapm 99165 1 2 1460380 772244 2 Feb27 ? 03:33:12 /data/oneapm/jdk1.8.0_65/bin/java -cp /data/oneapm/usercenter/usercenter_system:/
oneapm 97712 1 0 10956 1136 1 Feb27 ? 00:00:00 nginx: master process /data/oneapm/NginxHome_new/nginx-1.1.6.1/sbin/nginx -c /dat
oneapm 97713 97712 2 13422 11348 2 Feb27 ? 04:08:26 nginx: worker process
oneapm 97714 97712 3 13382 11292 1 Feb27 ? 06:34:10 nginx: worker process
oneapm 97715 97712 6 13602 12052 3 Feb27 ? 11:27:32 nginx: worker process
oneapm 63641 1 0 35690 700 2 2019 ? 00:00:01 sz Agent_10001_log.59.6.tgz
oneapm 72381 1 0 40493 2040 0 2018 ? 00:00:08 top
oneapm 46637 1 0 40493 1316 1 2018 ? 00:00:48 top
[oneapm@ONEAPM-NGINX01 ~]$ ps -eF | grep nginx
oneapm 28601 26507 0 28176 980 0 15:42 pts/4 00:00:00 grep --color=auto nginx
oneapm 97712 1 0 10956 1136 1 Feb27 ? 00:00:00 nginx: master process /data/oneapm/NginxHome_new/nginx-1.1.6.1/sbin/nginx -c /data/oneapm/NginxHome_new/nginx-1.1.6.1/conf/nginx.conf
oneapm 97713 97712 2 13488 11612 2 Feb27 ? 04:08:19 nginx: worker process
oneapm 97714 97712 3 13482 11736 2 Feb27 ? 06:34:00 nginx: worker process
oneapm 97715 97712 6 13862 13192 3 Feb27 ? 11:27:09 nginx: worker process
[oneapm@ONEAPM-NGINX01 ~]$ ps -xfo user,ppid,pid,tid,pri,psr,%cpu,%mem,stat,cmd
USER PPID PID TID PRI PSR %CPU %MEM STAT CMD
oneapm 26497 26506 26506 19 2 0.0 0.0 S sshd: oneapm@pts/4
oneapm 26506 26507 26507 19 3 0.0 0.0 Ss \_ -bash
oneapm 26507 31409 31409 19 3 0.0 0.0 R+ \_ ps -xfo user,ppid,pid,tid,pri,psr,%cpu,%mem,stat,cmd
oneapm 21831 21837 21837 19 1 0.0 0.0 S sshd: oneapm@pts/3
oneapm 21837 21838 21838 19 3 0.0 0.0 Ss \_ -bash
oneapm 21838 21895 21895 19 0 1.6 0.0 S+ \_ htop
oneapm 1 99165 99165 19 2 2.1 9.6 Sl /data/oneapm/jdk1.8.0_65/bin/java -cp /data/oneapm/usercenter/usercenter_system:/data/oneapm/u
oneapm 1 97712 97712 19 1 0.0 0.0 Ss nginx: master process /data/oneapm/NginxHome_new/nginx-1.1.6.1/sbin/nginx -c /data/oneapm/Ngin
oneapm 97712 97713 97713 19 2 2.4 0.1 S \_ nginx: worker process
oneapm 97712 97714 97714 19 0 3.8 0.1 S \_ nginx: worker process
oneapm 97712 97715 97715 19 1 6.7 0.1 S \_ nginx: worker process
oneapm 1 63641 63641 19 2 0.0 0.0 S sz Agent_10001_log.59.6.tgz
oneapm 1 72381 72381 19 0 0.0 0.0 S top
oneapm 1 46637 46637 19 1 0.0 0.0 S top
四、pgrep:进程状态过滤显示命令
pgrep 选项
选项说明:
-u 指明有效用户(显示该用户下进程id)
-U 指明实际用户id(显示该用户下进程id)
-l 显示进程名字
-a 显示完整格式的进程名字
-t 指明tty终端
-P pid 显示指定pid父进程下的子进程列表
示例:
[oneapm@ONEAPM-NGINX01 ~]$ pgrep -a -P 97712
97713 nginx: worker process
97714 nginx: worker process
97715 nginx: worker process
[oneapm@ONEAPM-NGINX01 ~]$ pgrep -U oneapm -l
21837 sshd
21838 bash
21895 htop
26506 sshd
26507 bash
46637 top
63641 sz
72381 top
97712 nginx
97713 nginx
97714 nginx
97715 nginx
99165 java
五、pidof:根据进程名获取PID
pidof 进程名
示例:
[oneapm@ONEAPM-NGINX01 ~]$ pidof nginx
97715 97714 97713 97712
六、top:进程动态信息查询
top内置子命令:
排序:
P 以占据CPU百分比排序
M 以占据内存百分比排序
切换:
m 切换是否显示内存使用情况
l 切换是否显示首行信息
t 切换是否显示Task统计及显示格式
1 切换是否分别显示多颗CPU的task统计信息
刷新时间:
s 后跟时间(单位秒),修改TOP刷新时间(默认为3s)
结束进程:
k 后根PID,结束指定PID进程
退出:
q
top显示信息说明:
top - 20:14:58 up 1 day, 19:17, 2 users, load average: 0.00, 0.01, 0.05
#当前系统时间 系统运行时长 用户数 平均负载(1分钟,5分钟,10分钟)
Tasks: 374 total, 2 running, 370 sleeping, 2 stopped 0 zombie
#进程数 running进程数 sleeping睡眠进程数 stopped停止进程数 zombie僵死进程数
%Cpu0 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 0.0 us, 0.4 sy, 0.0 ni, 99.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
#us用户空间程序占用百分比,sy系统空间程序占用百分比,ni为nice值占据的时间,id空闲比例,wa等待IO完成
的时间,hi硬件终段时间百分比,si软件终段时间百分比,st偷走时间比(如虚拟机)
KiB Mem : 3866948 total, 3137836 free, 170632 used, 558480 buff/cache
#total物理总内存,free剩余内存,used占用内存,buff/cache缓存内存
KiB Swap: 5242876 total, 5242876 free, 0 used. 3436820 avail Mem
#swap total交换空间总内存,swap free交换空间剩余内存,swap used交换空间占用内存,acail Mem物理可用空间
进程号 属主 优先级 nice值 虚拟内存集 常驻内存集 共享内存 准太 cpu占比 内存占比 运行时长 启动该进程的命令
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
31705 root 20 0 146276 2276 1428 R 1.0 0.1 0:00.11 top
1 root 20 0 91976 7316 2628 S 0.0 0.2 0:17.11 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.27 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.78 ksoftirqd/0
七、htop
htop子命令:
排序:
P 以占据CPU百分比排序
M 以占据内存百分比排序
进程跟踪:
s # 跟踪显示选定进程的系统调用
l # 跟踪显示选定进程打开的文件列表
进程绑定CPU
a # 将选定进程绑定至某指定CPU
退出
q
F系列按键
F1 # 使用帮助
F2 # 设置
F3 # 查找
F4 # 过滤
F5 # 树状显示父子进程
F6 # 排序
F7 # -nice值
F8 # +nice值
F9 # kill进程
F10 # 退出
八、kill命令:进程控制命令,通过向进程发送控制信号控制进程状态
kill -l # 显示kill的信号列表
常用信号:
1) SIGHUP # 通知进程重读配置文件,而不用重启进程
2) SIGINT # 终止正在运行的进程,相当于Ctrl + C
9) SIGKILL # 杀死正在运行的进程(立即终止进程)
15) SIGTERM # 优雅终止正在运行的进程(完成目前的读写操作后终止)
18) SIGCONT # 继续停止了的进程
19) SIGSTOP # 停止进程
kill -[信号名|信号代码] pid # 对指定pid进程发送信号,并执行信号代表的操作
示例:
kill -9 3655 # 立即终止指定pid的进程
kill -1 3655 # 再不重启进程的情况下重读配置文件
killall -[信号名|信号代码] 进程名 # 对同一进程名的进程发送信号并执行
示例:
killall -9 nginx
killall -HUP 进程名字 # 再不重启进程的情况下重读配置文件
九、nice、renice进程优先级的调整
nice值:-20--19
优先级=nice+120,结果数值越小越优先
若程序启动时进程的nice值为0,优先级为120
以指定nice值启动进程:nice -n nice值 进程脚本
示例:
[root@localhost ~]# nice -n -20 /data/nginxHome/sbin/nginx
修改进程的nice值:renice -n nice值 PID
查看进程的nice值:ps axo pid,comm,ni
十、fuser进程查看
fuser -v -m /data/ # 查看指定文件占用的进程
fuser -v -n tcp 80 # 参考指定的端口占用的进程
十一、作业(多组进程)管理
作业:为实现同一个项目的多组进程
前台作业:运行时占据了终端的命令行窗口的作业
后台作业:运行时后台运行,不占用终端的作业
作业前后台切换:可以使用vi/top等命令测试
将前台运行的作业切换到后台(仍然与终端关联)
Ctrl + Z
启动作业后,立即运行为后台作业(仍然与终端关联)
作业运行脚本 &
启动作业后,立即运行为后台,并剥离终端运行
nohup 作业运行脚本 &
查看目前正在运行的作业
jobs
将后台作业调回前台
fg %作业号
使后台停止状态的作业继续运行
bg %作业号
终止指定作业
kill %作业号