进程相关的概念
内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等
程序和进程的关系:
程序表现为磁盘上的一个文件(静态的概念)
当执行程序时,会在内存中开启一块区域,系统分配一个唯一的编号叫PID,执行结束时会释放这块区域(动态的)
task struct:Linux内核存储进程信息的数据结构格式
进程创建:
init:第一个进程
进程:都由父进程创建
CoW:copy on write 写时复制,父进程和子进程占用同一块内存空间,当子进程有写操作时,才在内存中开辟新的内存空间
进程优先级:
系统优先级:数字越小,优先级越高
0-98,各有99个运行队列和过期队列
实时优先级
nice优先级
进程内存:
Page Frame:页框,用于存储页面数据,存储Page 4K
LRU:Least Recently Used 近期最少使用算法,释放内存
假设序列为4 3 4 2 3 1 4 2,物理块有三个,则
第一轮 4调入内存 4
第二轮 3调入内存 3 4
第三轮 4调入内存 4 3
第四轮 2调入内存 2 4 3
第五轮 3调入内存 3 2 4
第六轮 1调入内存 1 3 2
第七轮 4调入内存 4 1 3
第八轮 2调入内存 2 4 1
物理地址空间和线性地址空间
MMU:Memory Management Unit负责转换线性和物理地址
IPC:Inter Process Communication
同一主机:signal:信号
shm:shared memory
semaphore:信号量
不同主机:socket:IP和端口号
RPC:remote procedure call 远程过程调用
MQ:消息队列,kafka
Linux内核:抢占式多任务
进程类型:
守护进程(后台进程):daemon,在系统引导过程中启动的进程,和终端无关进程
前台进程:跟终端相关,通过终端启动的进程
注意:两者可互相转化
进程状态与基本转换:
运行态:running
就绪态:ready
睡眠态:
可中断:interruptable
不可中断:uninterruptable
停止态:stopped,暂停于内存,但不会被调度,除非手动启动
僵死态:zombie,结束进程,父进程结束前,子进程不关闭
常用工具:
pstree:显示进程树
pstree -p
ps命令
支持三种选项:
UNIX选项 which may be grouped and must be preceded by a dash
BSD选项 which may be grouped and must not be used with a dash
GUN选项 which are preceded by two dashes
BSD选项:默认显示当前终端中的进程
a:选项包括所有终端中的进程
u:选项显示进程所有者的信息
x:选项包括与终端无关的进程
f:显示父子进程
k 属性:对属性排序,属性前加-表示倒叙
o 属性,...:显示定制的信息pid、cmd、%cpu、%mem
L:支持的属性列表
ps输出属性:
VSZ:Virtual memory size,虚拟内存集,线性内存 进程自己以为占用的内存
RSS:Resident Size,常驻内存集 系统给真正分配的内存
STAT:进程状态
R:running
S:interruptable sleeping
D:uninterruptable sleeping
T:stopped
Z:zombie
+:前台进程
<:高优先级进程
l:多线程进程
s:session leader,会话(子进程)发起者
ni:nice值
pri;priority优先级,与system优先级相反
psr:process CPU编号
rtprio:实时优先级
实例:ps axo pid,cmd,psr,ni,pri,rtprio
ps -C f1.sh 查看f1.sh这个脚本的状态
进程管理工具
top命令
选项:
-d #:指定刷新时间间隔,默认为3秒
-b:显示所有进程
栏位信息简介
us;用户空间
sy:内核空间
ni:调整nice时间
id:空闲
wa:等待IO时间
hi:硬中断
si:软中断
st:虚拟机偷走的时间
top:有许多内置命令:
排序:
P:以占据的CPU百分比排序,%CPU
M:占据内存百分比排序,%MEM
T:累计占据CPU时长排序,TIME+
首部信息显示:
uptime信息:l命令
tasks及cpu信息:t命令
cpu分别显示:1
memory信息:m命令
退出命令:q
修改刷新时间间隔:s
终止指定进程:k
htop命令(在epel源)
子命令:
s:跟踪选定进程的系统调用
l:显示选定进程打开的文件列表
a:将选定的进程绑定至某颗CPU核心
t:显示进程树
内存空间使用状态
free命令
选项:
-b:以字节为单位
-m:以MB为单位
-g:以GB为单位
-h:易读格式
vmstat命令:虚拟内存信息
vmstat 2 5 两秒刷新一次,5次后退出
procs
r:可运行(正运行或等待运行)进程的个数,和核心数有关
b:处于不可中断睡眠态的进程个数
memory:
swpd:交换内存的使用总量
free:空闲物理内存总量
buffer:用于buffer的内存总量
cache:用于cache的内存总量
swap:
si:从磁盘交换进内存的数据速率
so:从内存交换至磁盘的数据速率
pmap命令:进程对应的内存映射
pmap [options] pid [...]
-x:显示详细格式的信息
另一种实现:
cat /proc/PID/maps
pidof cmd:查看命令的PID
kill命令:
向进程发送控制信号,以实现对进程管理,每个信号对应一个数字,信号名称以SIG开头,不区分大小写
显示当前系统可用信号:kill -l,trap -l
常用信号:man 7 signal
1)SIGHUP:无须关闭进程而让其重读配置文件
2)SIGINT:终止正在运行的进程;相当于Ctrl+c
3)SIGQUIT:相当于Ctrl+ (在一些命令,比如bc,cat等,结果为退出)
9)SIGKILL:强制杀死正在运行的进程
15)SIGTERM:终止正在运行的进程 (相当于什么都不加的kill)
18)SIGCONT:继续运行
19)SIGSTOP:后台休眠
指定信号的方法:
1)信号的数字标识:1,2,9
2)信号完整名称:SIGHUP
3)信号的简写名称:HUP
按PID:kill [-SIGNAL] pid ...
kill -n SIGNAL pid
按名称:killall cmd
作业管理
Linux的作业控制:
前台作业:通过终端启动,且启动后一直占据终端
后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)
让作业运行于后台
1)运行的中作业:Ctrl+z
2)尚未启动的作业:COMMAND &
后台作业虽然被送往后台运行,但其依然于终端有关;退出终端,将关闭后台作业。如果希望送到后台后,剥离与终端的关系
nohup COMMAND &>/dev/null &
screen;COMMAND
查看当前终端所有作业:jobs
作业控制:
fg [[%]JOB_NUM]:把指定的后台作业调回前台
bg[[%]JOB_NUM]:让送往后台的作业在后台继续运行
kill [[%]JOB_NUM]:终止指定的作业
并行运行:同时运行多个进程,提高效率
1)vim all.sh
ping 127.1 &
ping 127.2 &
ping 127.3 &
2)(ping 127.1 &);(ping 127.2 &);(ping 127.3 &)
3){ping 127.1 & ping 127.2 & ping 127.3 &}
任务计划
Linux任务计划,周期性任务执行
1.未来的某时间点执行一次任务
at任务
包:at
at [OPTION] TIME
常用选项:
-l:列出指定队列中等待运行的作业
-c:查看具体作业任务
-d:删除指定的作业
依赖于atd服务,需要启动才能实现at任务
at队列存放在/var/spool/at目录中
/etc/at.{allow,deny} 控制用户是否能执行at任务
白名单:/etc/at.allow默认不存在,只有该文件中的用户才能执行at命令
黑名单:/etc/at.deny默认存在,拒绝该文件中用户执行at命令,而没有在at.deny文件中的使用者则可执行
如果两个文件都不存在,只有root可以执行at命令
有了allow文件之后,deny文件就失效了
2.周期性运行某任务
相关的程序包:
cronie:主程序包,提供crond守护进程及相关辅助工具
cronie-anacron:cronie的补充程序用于监控cronie任务执行情况
crontabs:包含Centos提供系统维护任务
/etc/crontab
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# .---------------- 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
注意:运行结果的标准输出和错误以邮件通知相关用户
1)COMMAND > /dev/null
2)COMMAND &> /dev/null
对于cron任务来讲,%又特殊用途,如果在命令中要使用%,需要转义,或者将%放置于单引号中,就不需要转义,写一个脚本最好
sleep命令:
sleep NUMBER[SUFFIX]...
SUFFIX:
s:秒,默认
m:分
h:小时
d:天
ntp同步时间
1.ntpdate 172.20.0.1
2.centos7
vim /etc/chrony.conf
server 172.20.0.1 iburst
3.systemctl enable chronyd
systemctl start chronyd
练习
1.每周的工作日1:30,将/etc备份至/backup目录中,保存的文件名称格式为“etcbak-yyy-mm-dd-HH.tar.xz”,其中日期是前一天的时间
2.每两小时去除当前系统/proc/meminfo文件中以S或M开头的信息追加至/tmp/meminfo.txt文件中
3.工作日时间,每10分钟执行一次磁盘空间检查,一旦发现任何分区利用率高于30%,就执行wall警报