进程的概念
内核和用户空间
image.png
进程的状态和转换
image.png
LRU算法
image.png
进程间通信
- 同一主机内
- pipe
- socket 文件
- signal 信号
- shm shared memory
- semaphore 信号量,一种计数器
- 不同主机
- socket IP和端口号
- RPC remote procedure call
- MQ 消息队列,Kafka, RabbitMQ, ActiveMQ
进程优先级
image.png
linux进程状态
- 运行态 running
- 就绪态 ready
- 睡眠态
- 可中断 interruptable
- 不可中断 uninterruptable
- 停止态 stopped, 暂停于内存, 但不会被调度,除非手动启动
- 僵死态 zombie, 结束进程,父进程结束前,子进程不关闭
进程工具
查看进程命令 ps
格式
ps [OPTION]...
选项
1.支持三种选项
- UNIX选项,如 -A -e
- BSD选项, 如 a
- GNU选项,如--help
- 选项
option | comment |
---|---|
默认 | 显示当前终端中的进程 |
a | 包括所有终端中的进程 |
x | 包括不链接终端的进程 |
u | 选项显示进程所有者信息 |
f | 选项显示进程树 |
k | --sort 属性 | 对属性排序,属性前加-表示倒序 |
o 属性... | 选项显示定制信息pid、cmd、%cpu、%mem |
L | 显示支持的属性列表 |
UNIX选项 | |
-C cmdlist | 指定指定命令的进程,多个命令用',' 分隔 |
-L | 显示线程 |
-e | 显示所有进程,相当于-A |
-f | 显示完整格式进程信息 |
-F | 显示更完整的格式的进程信息 |
-H | 以进程层级格式显示进程相关信息 |
-u userlist | 指定有效的用户ID或名称 |
-U userlist | 指定真正的用户ID或名称 |
-g gid or groupname | 指定有效的gid或组名称 |
-G gid or groupname | 指定真正的gid或组名称 |
-p pid | 显示指pid的进程 |
--ppid pid | 显示属于pid子进程 |
输出
output | comments |
---|---|
VSZ | virtual memory size, 虚拟内存集,线性内存 |
RSS | Resident size,常驻内存集 |
STAT进程状态 | |
R | running |
S | interrupttable sleeping |
D | unintertuptable sleeping |
T | stopped |
Z | zombie |
+ | 前台进程 |
l | 多线程进程 |
L | 内存分页并带锁 |
N | 低优先级进程 |
< | 高优先级进程 |
s | session lasder,会话发起者 |
ni | nice值 |
pri | priority优先级 |
psr | processor CPU编号 |
rtprio | 实时优先级 |
常用组合
command | comment |
---|---|
ps aux | 显示所有进程信息 |
ps -ef | 以多输出新方式显示所有进程 |
ps -eFH
ps axo pid,cmd,psr,ni,pri,rtprio |
ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm |
ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm |
# 查询你拥有的所有进程
ps -x
# 显示指定用户的进程
ps -fU apache
ps -fU 48
ps -fu tom
ps -fu 1000
#查看以root权限运行的进程
ps -U root -u root
#列出某个组拥有的所有进程
ps -fG nginx
# 列出有效组名称(或会话)所拥有的所有进程
ps -fg mysql
ps -fg 27
# 显示指定进程ID对应的进程
ps -fp 1234
# 以父进程ID来显示其下所有进程
ps -f --ppid 1234
# 显示指定PID的多个进程
ps -fp 1204,1239,1263
# 按tty显示所属进程
ps -ft pts/0
# 以进程树显示系统中的进程如何相互链接
ps -e --forest
# 以进程树显示指定的进程
ps -f --forest -C sshd
ps -ef --forest | grep -v grep | grep sshd
# 要显示一个进程的所有线程,将显示LWP(轻量级进程)以及NLWP(轻量级进 程数
ps -fL -C nginx
# 要列出所有格式说明符
ps L
# 查看进程的PID,PPID,用户名和命令
ps -eo pid,ppid,user,cmd
# 自定义格式显示文件系统组,ni值,开始时间和进程的时间
ps -p 1234 -o pid,ppid,fgroup,ni,lstart,etime
# 使用其PID查找进程名称
ps -p 1244 -o comm=
# 要以其名称选择特定进程,显示其所有子进程
ps -C sshd,bash
# 查找指定进程名所有的所属PID,在编写需要从std输出或文件读取PID的脚本时 这个参数很有用
ps -C httpd,sshd -o pid=
# 检查一个进程的执行时间
ps -eo comm,etime,user | grep nginx
# 查找占用最多内存和CPU的进程
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head ps -eo
pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head
# 显示安全信息
ps -eM
ps --context
# 使用以下命令以用户定义的格式显示安全信息
ps -eo euser,ruser,suser,fuser,f,comm,label
进程优先级
image.png
进程优先级调整
- 静态优先级 100-139
- 默认启动进程时:nice为0,优先级为120
nice命令 nice [OPTION] [COMMAND [ARG]..]
renice [-n] priority pid...
nice -n -10 tail -f /var/log/messages
[root@test1_c1 1]#ps -C tail -o pid,cmd,ni,pri
PID CMD NI PRI
5781 tail -f /var/log/messages -10 29
[root@test1_c1 1]#renice -n 0 5781
5781 (process ID) old priority -10, new priority 0
[root@test1_c1 1]#ps -C tail -o pid,cmd,ni,pri
PID CMD NI PRI
5781 tail -f /var/log/messages 0 19
[root@test1_c1 1]#renice -n -10 5781
5781 (process ID) old priority 0, new priority -10
# taskset 绑定cpu
[root@test1_c1 1]#taskset -p 6182
pid 6182's current affinity mask: 3
[root@test1_c1 1]#taskset -cp 1 6182
pid 6182's current affinity list: 0,1
pid 6182's new affinity list: 1
# pidof 查询命令对应的pid
[root@test1_c1 1]#pidof tail
6182
taskset -cp 'pidof dd' 0,2
进程搜索 pgrep [options] pattern
options | comments |
---|---|
-u uid | effective user |
-U uid | real user |
-t terminal | 与给定终端相关进程 |
-l | 显示进程名 |
-a | 显示完成格式的进程名 |
-P pid | 显示指定进程的子进程 |
- 查找命令的pid:pidof bash
杀死进程 kill
系统性能相关工具
/proc/uptime
系统启动时长;空闲进程的总时长(按总的cpu核数计算)
计算cpu利用率
[root@test1_c1 1]#cat /proc/uptime
62084.80 123985.78
uptime和w
[root@test1_c1 1]#uptime
14:42:08 up 17:05, 2 users, load average: 0.00, 0.01, 0.05
格式
- 当前时间
- 系统已启动的时间
- 当前上线人数
- 系统平均负载(1,5,10分钟的平均负载,一般不会超过1)
- 系统平均负载:指在特定时间间隔内运行队列中的平均进程数
- 通常每个cpu内核的当前活动进程数不大于3,那么系统的性能良好;如果每个cpu内核的任务数大于5,主机有严重性能问题
- 如果linux主机是1个双核CPU,当load average为6时说明机器已经被充分使用
top
内置命令
- 排序
- P:以占据CPU百分比排序,%CPU
- M:以占据内存百分比排序 %MEM
- T:累积占据的CPU时长, TIME+
- 头部信息显示:
- l 显示uptime信息
- t tasks及cpu信息
- 1 cpu分别显示
- m memory信息
- 退出 q
- 修改刷新时间间隔:s
- 终止指定进程:k
- 保存文件:W
输出信息
- us:用户空间
- sy:内核空间
- ni:调整nice的时间
- id:空闲
- wa:等待IO时间
- hi:硬中断
- si:软中断时间
- st:虚拟机偷走的时间
选项
- -d # 指定刷新时间间隔,默认3秒
- -b 全部显示所有进程
- -n # 刷新多少次后退出
- -H 线程模式,top -H -p
pidof mysqld
htop
- 选项
- -d #:指定延时时间
- -u UserName 仅显示指定用户的进程
- -s Colume:以指定字段进行排序
- 子命令
- s 跟踪选定进程的系统调用
- l 显示选定进程打开的文件列表
- a 将选定的进程绑定至某cpu核
- t 显示进程树
内存
free [OPTION]
- -h 易读格式
- -o 不显示-/+buffers/cache行
- -t 显示RAM+swap 总和
- -s n 刷新间隔为n秒
- -c n 刷新n次后即退出
# 清空cache
[root@test1_c1 1]#free -h
total used free shared buff/cache available
Mem: 972M 148M 143M 2.0M 680M 667M
Swap: 3.0G 41M 3.0G
[root@test1_c1 1]#find /proc -name 'drop*'
/proc/sys/fs/quota/drops
/proc/sys/vm/drop_caches
[root@test1_c1 1]#cat /proc/sys/vm/drop_caches
0
[root@test1_c1 1]#echo 3 > /proc/sys/vm/drop_caches
[root@test1_c1 1]#free -h
total used free shared buff/cache available
Mem: 972M 96M 839M 2.1M 36M 787M
Swap: 3.0G 41M 3.0G
vmstat
[root@test1_c1 1]#vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
3 0 42384 854808 0 41472 8 46 42 104 84 59 1 4 95 0 0
- proc:
- r 可运行(正运行或等待运行)进程的个数,和核心数有关
- b 处于不可中断睡眠态的进程个数(被阻塞的队列长度)
- memory
- swpd 交换内存的使用总量
- free 空闲物理内存总量
- buff 用于buffer的内存总量
- cache 用于cache的内存总量
- swap
- si 从磁盘交换进内存的数据速率(kb/s)
- so 从内存交换至磁盘的数据速率(kb/s)
- IO:
- bi 从块设备读入数据到系统的速率(kb/s)
- bo 保存数据至块设备的速率
- system
- in interrupts 中断速率,包括时钟
- cs context switch 进程切换的速率
- cpu
- us 用户空间
- sy 内核空间
- id idle
- wa IO等待时间
- st 虚拟机时间
监控工具
iostat
[root@test1_c1 1]#iostat
Linux 3.10.0-1127.el7.x86_64 (test1_c1.localdomain) 08/31/2020 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
1.02 0.00 4.38 0.00 0.00 94.59
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
scd0 0.00 0.12 0.00 8336 0
sda 0.77 6.52 49.70 457590 3488019
sdb 0.05 0.57 15.18 39904 1065333
sdc 0.97 75.57 72.89 5303616 5115393
sdd 0.17 0.94 66.76 66195 4684868
sde 0.01 0.22 0.00 15680 0
dm-0 0.61 5.66 30.50 396875 2140181
dm-1 4.89 0.46 19.18 32372 1345720
dm-2 0.02 0.15 0.21 10789 14890
iftop 监控网络带宽
iftop -n -i eth0
pmap 进程的内存映射
- pmap [options] pid [...]
- cat /proc/PID/maps
[root@test1_c1 1]#cat /proc/6770/maps
00400000-00411000 r-xp 00000000 fd:00 50624734 /usr/bin/dd
00610000-00611000 r--p 00010000 fd:00 50624734 /usr/bin/dd
00611000-00612000 rw-p 00011000 fd:00 50624734 /usr/bin/dd
0140f000-01430000 rw-p 00000000 00:00 0 [heap]
7feb1c483000-7feb229c5000 r--p 00000000 fd:00 50554561 /usr/lib/locale/locale-archive
7feb229c5000-7feb22b88000 r-xp 00000000 fd:00 1946153 /usr/lib64/libc.so.6
7feb22b88000-7feb22d88000 ---p 001c3000 fd:00 1946153 /usr/lib64/libc.so.6
7feb22d88000-7feb22d8c000 r--p 001c3000 fd:00 1946153 /usr/lib64/libc.so.6
7feb22d8c000-7feb22d8e000 rw-p 001c7000 fd:00 1946153 /usr/lib64/libc.so.6
7feb22d8e000-7feb22d93000 rw-p 00000000 00:00 0
7feb22d93000-7feb22db5000 r-xp 00000000 fd:00 40826 /usr/lib64/ld-2.17.so
7feb22fa8000-7feb22fab000 rw-p 00000000 00:00 0
7feb22fb3000-7feb22fb4000 rw-p 00000000 00:00 0
7feb22fb4000-7feb22fb5000 r--p 00021000 fd:00 40826 /usr/lib64/ld-2.17.so
7feb22fb5000-7feb22fb6000 rw-p 00022000 fd:00 40826 /usr/lib64/ld-2.17.so
7feb22fb6000-7feb22fb7000 rw-p 00000000 00:00 0
7fff20ae5000-7fff20b06000 rw-p 00000000 00:00 0 [stack]
7fff20bac000-7fff20bae000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
[root@test1_c1 1]#pmap -x 6770
6770: dd if=/dev/zero of=/dev/null
Address Kbytes RSS Dirty Mode Mapping
0000000000400000 68 40 0 r-x-- dd
0000000000610000 4 4 4 r---- dd
0000000000611000 4 4 4 rw--- dd
000000000140f000 132 20 20 rw--- [ anon ]
00007feb1c483000 103688 40 0 r---- locale-archive
00007feb229c5000 1804 328 0 r-x-- libc.so.6
00007feb22b88000 2048 0 0 ----- libc.so.6
00007feb22d88000 16 16 16 r---- libc.so.6
00007feb22d8c000 8 8 8 rw--- libc.so.6
00007feb22d8e000 20 12 12 rw--- [ anon ]
00007feb22d93000 136 108 0 r-x-- ld-2.17.so
00007feb22fa8000 12 12 12 rw--- [ anon ]
00007feb22fb3000 4 4 4 rw--- [ anon ]
00007feb22fb4000 4 4 4 r---- ld-2.17.so
00007feb22fb5000 4 4 4 rw--- ld-2.17.so
00007feb22fb6000 4 4 4 rw--- [ anon ]
00007fff20ae5000 132 16 16 rw--- [ stack ]
00007fff20bac000 8 4 0 r-x-- [ anon ]
ffffffffff600000 4 0 0 r-x-- [ anon ]
---------------- ------- ------- -------
total kB 108100 628 108
strace 跟踪程序进行的系统调用
strace dd
ltrace 程序调用的函数库
glances命令 c/s模式
- 服务器模式
glances -s -B IPADDR(监听地址) - 客户端模式
glances -c IPADDR(服务器地址)
dstat
iotop
nload
lsof 查看当前系统文件
- 进程管理
# 查看由登录用户/dev/pts/1启动而非系统启动的进程
lsof /dev/pts/1
# 指定进程号,查看该进程打开的文件
lsof -p 9527
- 文件管理
# 查看指定程序打开的文件
lsof -c httpd
# 查看指定用户打开的文件
lsof -u root | more
# 查看指定目录下被打开的文件
lsof +D /var/log # 递归列出目录下被打开的文件
lsof +d /var/log # 列出目录下被打开的文件
- 网络管理
#查看所有网络连接
lsof -i -n
lsof -i@127.0.0.1 #通过参数-i查看网络连接情况,包括连接的ip、端口等以及一些服务连接情况
# 查看端口连接情况
lsof -i:80 -n #查看端口80正在被哪些进程所使用
# 查看指定进程打开的网络连接
lsof -i -n -a -p 9527 # -i 查看网络连接情况;-a查看存在进程;-p指定进程
# 查看指定状态的网络连接
lsof -n -P -i TCP -s TCP:ESTABLISHED #-n:no host names, -P:no port names,-i TCP指定协议,-s指定协议状态通过多个参数可以 清晰的查看网络连接情况、协议连接情况等
# 恢复删除的文件
# 误删除/var/log/messages
lsof | grep /var/log/messages
rm -f /var/log/messages
lsof | grep /var/log/messages
cat /proc/653/fd/6
cat /proc/653/fd/6 > /var/log/messages
进程管理工具kill
向进程发送控制信号,以实现对进程的管理,每个信号对应一个数字,信号以SIG开头,不区分大小写。
信号
- 显示当前系统可用的信号 kill -l 或者trap -l
常用信号 | comment |
---|---|
1)SIGHUP | 无须关闭进程而让其重读配置文件 |
2)SIGINT | 终止正在运行的进程;相当于ctrl+c |
3)SIGQUIT | 相当于crtl+\,quit退出 |
9)SIGKILL | 强制杀死正在运行的进程 |
15)SIGTERM | 终止正在运行的进程, default value |
18)SIGCONT | 继续运行 |
19)SIGSTOP | 后台休眠 |
# sig 0 检查进程运行状况
kill -0 ping
[root@test1_c1 data]#killall -0 ping
[root@test1_c1 data]#echo $?
0
killall -0 httpd &>/dev/null || systemctl restart httpd
指定信号的方法
way | comments |
---|---|
1,2,9 | 信号的数字标识 |
SIGHUP | 信号完整的名称 |
HUP | 信号简写名称 |
kill命令
- 按PID:
- kill [-SIGNAL] pid ...
- kill -n SIGNAL pid
- kill -s SIGNAL pid
- 按名称
- killall [-SIGNAL] command...
- 按模式
- pkill [OPTIONS] pattern
- SIGNAL
- -u uid: effective user
- -U uid: real user
- -t terminal: 与指定的终端相关的进程
-l 显示进程名
-a 显示完整格式的进程名
-P pid:显示指定进程的子进程
作业管理
linux的作业控制
- 前台作业:通过终端启动,且启动后一直占据终端
- 后台作业:可通过终端启动,单启动后即转入后台运行(释放终端)
让作业运行于后台
- 运行中的作业 : ctrl+z
- 启动作业:COMMAND &
剥离作业与终端的关系
后台作业虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭后台作业。如果希望送往后台后,剥离与终端的关系:
- nohup COMMAND &>/dev/null &
- screen; COMMAND
查看当前终端所有作业 jobs
作业控制:
- fg [[%]JOB_NUM] 把指定的后台作业调回前台
- bg [[%] JOB_NUM] 让送往后台的作业在后台继续运行 (ctrl+z 的作业)
- killall -19 command 让后台运行的作业休眠
- killall -18 command 让后台休眠的作业运行 == bg
18)SIGCONT | 继续运行
19)SIGSTOP | 后台休眠 -
kill[%JOB_NUM] 终止指定的作业
image.png
并行运行
同时运行多个进程,提高效率
1 方法1
- vi all.sh
- f1.sh&
- f2.sh&
- f3.sh&
- 方法2
(f1.sh&);(f2.sh&);(f3.sh&) - 方法3
{ f1.sh& f2.sh& f3.sh& } note 前后有空格
# 顺序执行
ping -c3 www.taobao.com;ping -c3 www.baidu.com; ping -c3 www.qq.com
# 方法1
vim ping_pa.sh
ping -c3 www.baidu.com &
ping -c3 www.qq.com &
ping -c3 www.taobao.com &
bash ping_pa.sh
# 方法2
(ping -c3 www.baidu.com &);(ping -c3 www.qq.com &); (ping -c3 www.taobao.com &)
# 方法3
{ ping -c3 www.baidu.com & ping -c3 www.baidu.com & ping -c3 www.baidu.com & }
计划任务
at
指定时间点,执行一次性任务 at [option] TIME
- option
options | comments |
---|---|
-V | 显示版本信息 |
-t time | 时间格式[[CC]YY]MMDDhhmm[.ss] |
-l | 列出指定队列中等待运行的作业;相当于atq |
-d | 删除指定的作业;相当于atrm |
-c | 查看具体作业任务 |
-f /path/file | 指定的文件中读取任务 |
-m | 当任务完成后,将给用户发送邮件 |
note | 作业执行命令的结果中的标准输出和错误以邮件通知给相关用户 |
- TIME 定义什么时间进行at这项任务的时间
- HH:MM[YYYY-mm-dd]
- noon,midnight,teatime(4pm)
- tomorrow
- now+#{minutes,hours,days,OR weeks}
- at的时间格式
- HH:MM
#2点20分
02:00
- HH:MM YYYY-MM-DD
02:00 2019-08-25
- HH:MM [am][pm][month][date]
04 pm march 17
17:20 tomorrow
- HH:MM[am|pm] + #[minutes|hours|days|weeks]
now + 5 min
02pm + 3 days
- at任务
- 执行方式:1)交互式 2)输入重定向 3) at -f 文件
- 依赖atd服务
- at 队列存放在/var/spool/at中
- /etc/at.{allow,deny}控制用户是否能执行at任务
a)白名单:/etc/at.allow 默认不存在,只有该文件用户才能执行at命令
b)黑名单:/etc/at.deny 默认存在,该文件中的用户不能执行at命令
c)如果2个文件都不存在,只有root可以执行at命令
at 07:20
touch file
ctrl+d #退出
at -c 1 # 查jobs的详细信息
at -l # 列出jobs列表
at -d # 删除jobs列表
cron 周期性运行某任务
相关程序包
在/etc/crobtab中加入周期运行任务
# 在crontab里加入定时任务
[root@www data]# cat /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
*/10 * * * 1-5 tom /data/check_disk.sh
# 观察cron输出
tail -f /var/log/cron
# 每个工作日的凌晨2点30执行备份任务
30 2 * * 1-5 tom /data/backup.sh
# 每个周六周日或者每个月的1,10,20号的2点30分执行备份任务
30 2 1,10,20 * 0,6 tom /data/backup.sh
使用命令crontab -e
* * * * 1-5 echo hello world
创建crob任务list文件执行
# 执行顺序按文件名顺序
[root@www data]# echo wall 1 > /data/cronlists/f1.sh
[root@www data]# echo wall 2 > /data/cronlists/f2.sh
[root@www data]# echo wall 3 > /data/cronlists/f3.sh
crontab -e
*/5 * * * * /usr/bin/run-parts /data/cronlists
系统的计划任务
[root@www data]# ls /etc/cron
cron.d/ cron.daily/ cron.deny cron.hourly/ cron.monthly/ crontab cron.weekly/
@reboot的计划任务
@reboot /usr/bin/touch newfile
cron执行多任务
0 */3 * * * centos /bin/echo “howdy”; wall “welcome to Magedu!”
管理临时文件
systemd-tmpfiles-setup
辅助命令
crontab -l # 查看cron 任务
crontab -l -u tom # 查看用户tom创建的cron任务
#crob 任务保存在
ls /var/spool/cron/
# 删除tom的crontab 任务
crontab -r -u tom
# 日志
ls /var/log/cron
# 控制用户执行计划任务:
/etc/cron.{allow,deny}
# 使用sleep来实现秒级cron任务
注意
运行结果的标准输出和错误以邮件通知给相关用户
- COMMAND > /dev/null
- COMMAND &> /dev/null
进程管理.png