进程
进程相关概念
进程Process:动态概念,运行中程序的一个副本,是被载入内存的一个指令集合;它有生命期
进程号(Process ID)PID:系统分置编号来标识各个进程
UID、GID和SELinux语境决定对文件系统的存取和访问权限,通常从执行进程的用户来继承
程序:静态概念,不运行时,存放在磁盘上
进程创建
Centos 6:init 第一个进程
Centos 7:systemd 第一个进程
进程都是父进程创建子进程:CoW,fork( ),clone( )方式
task struct:Linux内核存储进程信息的数据结构格式
task list:多个任务的task struct组成链表
Linux内核:抢占式多任务
进程内存
Page Frame:页框,用存储页面数据,存储Page 4k
LRU:Least Recently Userd 近期最少使用算法
物理地址和线性地址空间
VSZ:Virtual memory Size 虚拟内存集,线性内存(承诺分配的内存空间)
RSS:ReSident Size 常驻内存集(实际使用的内存空间)
MMU:Memory Manager Unit 负责转换线性和物理地址
TLB:Translation Lookaside Buffer 翻译后备缓冲器,用于保存虚拟地址和物理地址映射关系的缓存
进程间通信IPC(Inter Process Communication)
同一主机
signal:信号
shm shared memory:共享内存
semaphore:信号量,一种计数器
不同主机
socket:IP和端口号
RPC:remote procedure call
MQ:消息队列,Kafka,ActiveMQ
进程的基本状态
创建状态
就绪状态
执行状态
阻塞状态
终止状态
进程优先级
系统优先级:数字越小,越优先
0-139(centos4,5)
0-98,99(centos7)
实时优先级:值最大优先级最高
99-0
nice优先级:值越小,越优先
-20~19
对应系统系统优先级100-139或99
调整优先级
静态优先级:100-139
进程默认启动时的nice值为0,只有root用户才能降低nice值(提高优先性)
运行程序时指定优先级
nice [OPTION] [COMMAND [ARG]...]
nice -n -# command
修改处于运行中的进程优先级
renice [-n] priority pid...
renice -n # pid
Big O:时间复杂度,用时和规模关系
O(1),O(logn),O(n)线性,O(n^2)抛物线,O(2^n)
进程的类型(按进程与终端关系分类)
守护进程:daemon,在系统引导过程中启动的进程,和终端无关进程
前台进程:跟终端相关,通过终端启动的进程
注意:两者可相互转化
进程分类(按进程占用资源多少分类)
CPU-Bound:CPU密集型,非交互
IO-Bound:IO密集型,交互
进程状态
运行态running
就绪态ready
睡眠态sleeping
可中断 interruptable sleeping
不可中断uninterruptable sleeping
停止态ztopped
僵死态zombie
STAT
R:running
S:interruptable sleeping
D:uninterruptable sleeping
T:stopped
Z:zombie
+:前台进程
l:多线程进程
L:内存分页并带锁
<:高优先级进程
N:低优先级进程
s:session leader,会话发起者
进程管理工具
进程管理工具
pstree,ps,uptime,top,htop,iotop,free,vmstat,iostat,dstat,glances,kill
作业管理
Linun作业的控制
前台作业:通过终端启动,且启动后一直占据着终端;
后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)
让作业运行于后台
1、运行中的作业:ctrl+z
2、command &
后台作业虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭后台作业。如果希望送往后台,剥离与终端关系
nohup command &>/dev/null
screen;command
查看当前终端所有作业:jobs
作业控制
fg [[%]JOB_NUM]:把指定的后台作业调回前台
bg [[%]JOB_NUM]:让送往后台的作业在后台继续运行
kill [[%]JOB_NUM]:终止指定作业
也可发信号来控制作业
计划任务
一次性任务计划:未来某时间点运行一次任务
at 命令
at [option] TIME
-V:显示版本信息
-l | arq:列出指定队列中等待运行的作业
-d | atrm:删除指定作业
-c:查看具体业务
-f /path/from/somefile:从指定文件中读取任务
-m:任务完成后即使没有标准输出也给用户发邮件
注意:作业执行命令结果以邮件方式通知给相关用户
TIME:定义什么时候进行at这项任务时间
HH:MM[YYYY-mm-dd]
02:00 在今日的2点进行,若已过2点,则明天2点执行任务
02:00 2018-05-04 规定在某年某月某一天进行该任务
noon,midnight,teatime(4pm)
tomorrow
17:20 tomorrow
now+#{minutes,hours,days,OR weeks}
now + 5 minutes 某个时间点再加几个时间后才进行该任务
at队列存放在/var/spool/at目录中
执行方式
1、交互式:直接使用命令
2、输入重定向
at time <<EOF
cmd1
cmd2
EOF
3、at -f file:把要执行的任务放到文件中
黑白名单:控制用户是否能执行at任务 /etc/at.{allow,deny}
白名单/etc/at.allow:默认不存在,只有该文件中用户才能执行at命令
黑名单/etc/at.deny:默认存在,拒绝该文件中用户执行at命令,而没有在at.deny文件中的使用者则可执行
如果两个文件都不存在,只有root用户可以执行
注意:黑名单是拒绝创建新任务,原来有的任务计划还可执行
batch 系统自行选择空闲时间去执行此处指定的任务
周期性任务计划:周期性运行某任务
cron
相关程序包
cronie:主程序包
cronie-anacron:cronie补充程序,用于监控cronie任务执行状况,如果cronie中任务在过去该运行时间点未能正常运行,则anacron会随后启动一次此任务
crontabs:包含Centos提供系统维护任务
确保crond守护处于运行状态
Centos 7:systemctl status crond
Centos 6:service crond status
计划周期性执行的任务提交给crond,到指定时间会自动运行
系统cron任务:系统维护作业
/etc/crontab
用户cront任务
crontab命令
日志:/var/spool/cron
系统cron任务:/etc/crontab
------------- 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
分钟 小时 日 月 周 用户 要运行的任务
例 每2分钟以root身份显示how are you?
*/2 * * * * root /bin/echo "how are you?"
注意:要运行的任务如果是命令或者脚本,建议使用绝对路径或自定义一个拥有完整路径的环境变量
时间表示法
1、特定值:给定时间点有效取值范围内的值
2、*:给定时间点上有效取值范围内的所有值;每...
3、连续取值:#-#
4、离散取值:#,#,#
5、在指定时间范围上,定义步长;/# #即为步长
时间格式
@reboot 每次重启电脑
@yearly 0 0 1 1 * 每年
@annually 0 0 1 1 *
@monthly 0 0 1 * *
@weekly 0 0 * * 0
@daily 0 0 * * *
@hourly 0 * * * *
系统的计划任务
/etc/crontab
/etc/cron.d/ 配置文件
/etc/cron.hourly/ 脚本
/etc/cron.daily/ 脚本
/etc/cron.weekly/ 脚本
/etc/cron.monthly/ 脚本
用户cron任务
crontab命令定义
每个用户都有专用的cron任务文件:/var/spool/cron/USERNAME
crontab命令
crontab [-u user] [-l | -r | -e] [-i]
-l:列出所有任务
-e:编辑任务
-r:移除任务
-i:同-r配合使用,交互式模式删除
-u user:仅root用户运行,管理指定用户cron任务
控制用户执行计划任务
/etc/cron.{allow,deny} 同at
注意:运行结果的标准输出和错误以邮件方式通知相关用户
没有被重定向的输出会以邮件方式发送给相关用户;root用户能够修改其它用户的作业
丢弃邮件,输出重定向:
1、command > /dev/null
2、command &>/dev/null
cron任务中的%有特殊用途;如果要在命令中使用%,需要转义,将%放置于单引号中,则可不用转义
例
* * * * * /bin/touch file-$(date +'%F-%H-%M-%S')
* *** * /bin/touch file-$(date +\%F-\%H-\%M-\%S)
在秒级运行任务
* * * * * for min in 0 1 2;do echo "hi"; sleep 20; done
每7分钟运行一次
sleep 命令
sleep 7m;command