第13章,进程和计划任务
Linux学习从入门到打死也不放弃,完全笔记整理(持续更新,求收藏,求点赞~~~~)
http://blog.51cto.com/13683480/2095439
第13章,进程和计划任务
本章内容:
进程相关概念
进程及系统相关工具
计划任务
进程概念:
内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等
process: 运行中的程序的一个副本,是被载入内存的一个指令集合
进程ID(PID)号码被用来标记各个进程
UID、GID、和SElinux语境决定对文件系统的存取和访问权限
通常从执行进程的用户来继承
存在生命周期
task struct: Linux内核存储进程信息的数据结构格式
task list: 多个任务的task struct组成的链表
进程创建:
init/systemd: 第一个进程
进程都是由其父进程创建, CoW 写时复制机制
fork()生成子进程,clone()生成子进程或者兄弟进程
进程的基本状态:
创建状态:
进程在创建时需要申请一个空白PCB(process control block进程控制块)
向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法
完成,比如资源无法满足,就无法被调度运行、把此时进程所处状态称为
创建状态
就绪状态:
进程已准备好,已分配到所需资源,只要分配到CPU旧能够立即运行
执行状态:
就绪状态被调度后,进程进入执行状态
阻塞状态:
正在执行的进程由于某些事件(io请求,申请缓存区失败)而暂时无法运行,
进程受到阻塞。在满足请求时进入就绪状态等待系统调用
终止状态:
进程结束,或出现错误,或被系统终止,进入终止状态,无法再执行
------ 许可 ------ 时间片完 ------ 释放 ----
| 创建 | ————————>> | 就绪 |<<=============>>| 执行 |————————>> |终止|
------ ------ 进程调度 ------ ----
o | |
o | I/O完成 ------ I/O请求|
o <<————————| 阻塞 |<<————————
就绪状态无法直接变成阻塞状态,先执行
阻塞状态无法直接变成执行状态,先就绪
进程优先级:
系统优先级:
0-139 centos4 5
各有140个运行队列和过期队列
0-98,99 centos6
实时优先级:99-0 值越大优先级最高
nice值:-20到19,对应系统优先级100-139(centos45) 或99(centos6)
Big O:时间复杂度,用时和规模的关系
O(1),O(logn),O(n)线性,O(n^2)抛物线,O(2^n)
进程优先级调整:
静态优先级:100-139
进程默认启动时的nice值为0,优先级为120
只有root用户才能降低nice值(提高优先级)
nice:
nice [option][cmd [arg]]
如:nice -n 10 vim & 将vim的优先级降低10
nice -n -15 vim 将vim的优先级提高15并执行
renice:
renice [-n] priority
如:
renice 0|5|-5 -p 93074 将pid为93074的ni 设为0|5|-5
renice 10 -u root 将用户root的进程ni设置为10
进程相关概念:
进程内存:
Page Frame:页框,分页存储,Page 4K
LRU:Least Recently Used 近期最少使用算法,释放内存
MMU: Memory Management Unit 负责转换线性和物理地址
TLB:Translation Lookaside Buffer 翻译后备缓冲器,用户保存虚拟地址
和物理地址关系的缓存
IPC: Inter Process Communication 进程间通信
同一主机:
signal:信号
shm:shared memory 共享内存
semaphore:信号量,一种计数器
不同主机:
socket: IP和端口号
RPC: remote procedure call
MQ: 消息队列,kafka,ActiveMQ
进程类型:
守护进程:daemon,在系统引导过程中启动的进程,和终端无关进程
前台进程:跟终端相关,通过终端启动的进程
注意:两者可相互转化
进程状态
运行态: running
就绪态: ready
睡眠态:
可中断: interruptable
不可中断:uninterruptable
停止态: stopped,暂停于内存,但不会被调度,除非手动启动
僵死态: zombie,僵死进程
进程分类:
CPU-Bound: cpu密集型,非交互,如加密解密
IO-Bound: IO密集型,交互
系统管理工具:
Linux系统状态的查看及管理工具:
pstree,ps,pidof,top,htop,glance,pmap,vmstat,
dstat,kill,pkill,job,bg,fg,nohup
pstree:
pstree -p
Linux 系统各进程的相关信息均保存在/proc/PID目录下的各文件中
ps:
ps [option]... 查看进程状态信息
支持三种风格选项:
UNIX选项 -A -e
BSD选项 a u x
GNU选项 --help
ps: 默认显示当前终端中的进程
a 所有终端中的进程
x|-x 所有非终端进程
u 显示进程所有者的信息
f|--forest 显示进程树
k|--sort [-]属性 对属性排序,-表示倒序
centos6不支持%cpu %mem排序
o 属性1,属性2.. 指定需要显示的信息
如:pid,cmd,%cpu,%mem
L 支持的属性列表
-C cmd1,cmd2,.. 指定命令
-L 显示线程
-e|-A 显示所有进程
-f 显示完成格式进程信息
-F 显示更完整格式的进程信息
-H 以进程层级格式显示进程相关信息
-u userlist 指定有效的用户ID或名称 euid
-U userlist 指定真正的用户ID或名称 ruid
-g gid或groupname 指定有效的gid或组 egid
-G gid或groupname ruid
-p pid 显示pid的进程
--ppid pid 显示pid的子进程信息
-M|Z 显示SElinux的信息,相当于Z
-C cmd -o pid= 通过cmd查看pid
-p pid -o comm= 通过pid查看comm
alias ps1='ps xo user,pid,%cpu,%mem,vsz,rss,tty,stat,start,time,pri,nice,cmd'
输出属性:
VSZ: Virtual memmory size,虚拟内存集,线性内存
RSS: Rdsident Size, 常驻内存集,实际占用内存
STAT: 进程状态
R: running
S: interrupttable sleeping 可中断睡眠
D: uninterrupttable sleeping 不可中断睡眠
T: stopped 停止
Z: zombie
+ 前台进程
l 多线程进程
L 内存分页并带锁
N 低优先级进程
< 高优先级进程
ni: nice值
pri: priority优先级
psr: processor CPU编号
rtprio: 实时优先级
示例:
ps axo pid,cmd,psr,ni,pri,rtprio
常用组合:
aux -ef -eFH
-eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm
axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
显示指定用户名(RUID)或用户ID的进程
ps -fU apache
ps -fU 48
此处貌似用-u 也不错,因为apache是系统用户,结果一样
显示指定用户名(EUID)或用户ID的进程
ps -fu wang
ps -fu 1000
这里用-U,结果就有可能不一样了
查看以root用户权限(实际和有效ID)运行的每个进程:
ps -U root -u root
列出某个组拥有的所有进程(实际组ID:RGID 或名称)ps
ps -fG nginx
列出有效组名称(或会话)所拥有的所有进程:
ps -fg mysql
ps -fg 27
通过进程id来显示所属的进程:
ps -fp 1234
以父进程ID来显示其下所有的进程,如显示父进程为1154的所有进程:
ps -f/l --ppid 1154
显示中PID的多个进程
ps -lp 6507 6508 6509...
要按tty 显示所属进程
ps -lt pts/4
以进程树显示系统中的进程如何相互链接
ps -e --forest ps auxf
以进程树显示指定的进程
ps f -f -C sshd
ps -ef --forest |grep -v grep |grep sshd
要显示一个进程的所有线程,将显示LWP(轻量级进程)以及NLMP(轻量级进程数)列:
ps -fL -C httpd
要列出所有格式说明符:
ps L
查看进程的PID ppid 用户名 和命令
ps -eo pid,ppid,user,cmd
自定义格式显示文件系统组,ni值开始时间和进程的时间
ps -p 1234 -o pid,ppid,fgroup,ni,lstart,etime
使用其PID查找进程名称
ps -p 1234 -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
使用watch使用程序执行重复的输出以实现对进程进行实时的监视,如
下面的命令显示每秒钟的监视:
watch watch -n 1 'ps -eo pid,ppid,cmd,%mem,%cpu f -mem%|head'
搜索进程:----------------------------------------------------------------
ps 选项 | grep等其他命令
按预定义的模式:pgrep
pgrep:
pgrep [options] pattern
-u uid euid,有效用户为uid的所有进程 的pid
-U uid Ruid,真实用户为uid的所有进程 的pid
-t termina 与指定终端相关的进程的pid
-l 显示进程名
-a 显示完成进程名(centos6 不支持)
-P pid 显示指定进程的子进程
pidof 按确切的程序名称查找
piodof /bin/bash
系统工具:---------------------------------------------------------
uptime:
显示当前时间,系统已启动的时间,当前上线人数,系统平均负载(1/5/10分钟 )
系统平均负载:
在特定时间间隔内运行队列中的平均进程数
通常每个cpu内核的当前活动进程数不大于3,那么系统的性能良好。
如果每个cpu内核的任务数大于5,那么次主机的性能有严重问题
如果linux主机是1个双核cpu,当load Average = 6 ,说明机器已经被充分使用
进程管理工具:------------------------------------------------------------------
top:
内键命令:
排序:
p 以占据的cpu百分比,%cpu
M 占据内存百分比
T 累计占据cpu时间,TIME+
首部信息显示:
l uptime信息
t tasks及cpu信息
1(数字) cpu分别显示
m memory信息
退出命令 q
修改刷新时间间隔 s
终止指定进程 k
保存文件: W
显示完成cmd c
栏位信息简介
cpu:us 用户空间,sy 内核空间,ni 调整nice时间,id 空闲时间
wa 等待IO时间,hi 硬中断,si 软中断,st 被虚拟机偷走的时间
选线:
-d # 指定刷新时间间隔,默认为3s
-b 全部显示所有进程
-n # 刷新多少次后退出
htop:
选项:
-d # 指定延迟时间
-u 仅显示指定用户的进程
-s COLUME 以指定字段进行排序
排序:P M T
s 跟踪选定进程的系统调用
l 显示选定进程打开的文件列表
a 将选定的进程绑定至某指定CPU核心
t 显示进程数
k 结束进程
q 退出
kill:
向进程发送控制信号,以实现对进程管理,每个信号对应一个数字,信号名称
以SIG开头(可省略),不区分大小写
显示当前系统可用信号
kill -l
trap -l
常用信号: man 7 signal
1 SIGHUP 无须关闭进程而让其重读配置文件
2 SIGINT 终止正在运行的进程,相当于ctrl+c
3 SIGQUIT 相当于ctrl+\
9 SIGKILL 强制杀死正在运行的进程
15 SIGTERM 终止正在运行的进程
18 SIGCONT 继续运行
19 SIGSTOP 后台休眠
指定信号的方法
数字方式,1,2,9,15
信号的完成名称 SIGHUP
信号的简写名称 HUP
按PID:
kill [-signal] pid
kill -n HUP pid kill -s SIGHUP pid
按名称:
killall [-signal] command
按模式:
pkill [options] pattern
-signal
-u uid euser为pid 的进程
-U uid ruser为pid 的进程
-t terminal 指定终端相关的进程
-l 显示进程名
-P pid 指定进程的子进程
内存工具:-----------------------------------------------------------
free:
free [option] 查看内存空间使用状态
-b 以字节为单位
-m 以MB为单位
-g 以GB为单位
-h human 易读格式
-o 不显示-/+ buffers/cache 行
-t 显示RAM+swap 的总和
-s n 刷新时间为n秒
-c n 刷新n次后退出
vmstat:
vmstat [optins] [delay[count]] 虚拟内存以及磁盘io查询
vmstat 2 5 表示2秒刷新一次,一共刷5次
-m 查看内存具体使用情况非常详细
-s 内存统计信息
--help 使用帮助
信息显示:
procs:
r 可运行(正在执行或等待运行)进程的个数,和核心数有关
b 处于不可中断睡眠态的进程个数(被阻塞的队列的长度)
memory
swpd 交换内存使用总量
free 空闲物理内存总量
buffers cache 用于buffer/cache的内存总量
swap
si 从磁盘交换进内存的数据速率(kb/s)
so 从内存交换至磁盘的数据速率(kb/s)
io
bi 从块设备读入数据到内存的速率(kb/s)
bo 保存数据至块设备的速率
system
in: interrupts 中断速率,包括时钟
cs context switch 进程切换速率
cpu
us 用户空间,sy 内核空间,id 空闲时间,wa 等待时间 st 偷走时间
iostat:
统计cpu和设备io信息
iostat 1 5 刷新显示
pmap 进程对应的内存映射
pmap [options] pid..
-x 显示详细格式
如 pmap -x 1
另外一种实现:
cat /proc/pid/maps
系统监控工具-----------------------------------------------------------
glances:
glaces [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port]
[-P password] [--password] [-t refresh] [-f file] [-o output]
内键命令:
排序: a 自动排序
c cpu%排序
m mem%排序
p 按名称排序
i 按IO排序
u user排序
t network I/O
显示/隐藏 左侧窗口显示
d disk 磁盘io信息
f file system stats,文件系统信息
n network stats 网络信息
s Show/hide sensors stats
y Show/hide hddtemp stats
l Show/hide logs
其他:
b 网络信息用bit为单位
w Delete warning logs
x Delete warning and critical logs
数字1 分别显示单颗cpu
h help 帮助界面
q 退出
常用选线:
-b =b以byte为单位显示网卡数据速率
-d d 关闭磁盘IO模块
-f file 设定输入文件位置
-t # 延迟时间间隔
C/S模式下云心glances命令
服务器模式:
glances -s -B IP
客户端模式:
glances -c IP
dstat:
系统资源统计,代替vmstat iostat
dstat [avf][options] [delay[count]]
例如:
dstat -av 3 5 3秒一次刷新 一共刷新5次
选项: -c cpu相关
-d disk相关
-g page相关
-m mem相关
-n net相关
-p proc相关
-r io 相关
-s swap相关
长选项
--tcp --udp --unix --raw --socket --ipc
--top-cpu
--top-io
--top-mem
--top-latency 延迟最大的进程
iotop:
用来监视磁盘I/O使用状况的top类工具,具有与top相似的UI,其中包括
PID、用户、IO、进程等相关信息,可查看每个进程是如果使用io
iotop输出信息:
第一行: read 和write的速率总计
第二行: 实际的read和write速率
第三行:
TID/PID : 线程id,按p转换为pid
PRIO: 优先级
USER: 用户
DISK READ: 磁盘读速度
DISK WRITE:磁盘写速度
SWAPIN: swap使用百分比
COMMAND: 进程命令
选项:
-o --only 只显示正在产生IO的进程, 运行中按o生效
-b --batch 非交互模式,一般用户记录日志
-d # --delay= 刷新间隔默认1s 可以为小数 比如1.5
-n # --iter= 检测次数,默认无限
-p PID --pid= 指定检测的进程
-u USER --user= 指定检测某个用户产生的IO
-P --processes 仅显示进程,默认iotop显示所有线程
-a --accumulated 显示累计的IO,而不是带宽 交互a键
-k --kilobytes 使用KB单位
-t --time 加上时间戳,非交互式
-q --quit 禁止头几行,非交互式,有三种指定方式
-q 只在第一次检测时显示列名
-qq 永远不显示列名
-qqq 用户不显示i/o汇总
交互式按键:
r 反向排序
o 切换至选线only
p 切换至processes选线
a 速率/带宽切换
q 退出
i 改变线程的优先级
作业管理--------------------------------------------------------------------
linux的作业控制:
前台作业: 通过终端启动,且启动后一直占据终端
后台作业: 可通过终端启动,但启动后即转入后台运行(释放终端)
让作业运行与后台:
1 运行中的作业: ctrl+z
2 尚未启动的作业 cmd &
后台作业虽然被送往后台运,但其依然与终端相关,退出终端,将关闭后台作业
如果希望送往后台后,剥离与终端的关系
nohup cmd &>/dev/null &
screen;cmd
查看当前终端所有作业:
jobs
作业控制:
fg [[%]num] 把指定的后台作业调回前台
bg [[%]num] 让送往后台的作业在后台继续运行
kill [%num] 终止指定的作业
并行运行:
同时运行多个进程,提高效率
方法1:
vim all.sh
f1.sh &
f2.sh &
f3.sh &
all.sh
方法2:
(f1.sh&);(f2.sh&);(f3.sh)
方法3:
{ f1.sh& f2.sh& f3.sh& }
计划任务:
Linux任务计划、周期性任务执行
未来的某个时间点执行一次任务
at
batch 系统自行选择空闲时间去执行此处执行的任务
周期性运行某任务
cron
centos设置时间同步
需有一台用于同步时间的服务器,提供同步IP
centos6:
vim /etc/ntp.conf
添加一行:
server IP iburst
chkconfig ntpd on
service ntpd star
ntpdate ip
centos7
vim /etc/chrony.conf
添加一行:server ip iburst
systemctl start chronyd
systemctl enable chronyd
ntpdate ip
at任务:
at [option] TIME
常用选项:
-V 显示版本信息
-l 列出指定队列中等待运行的作业,相当于atq
-d 删除指定的作业,相当于atrm
-c 查看具体作业任务
-f file 从指定的文件中读取任务
-m 当任务完成之后,将给用户发送邮件,即使没有标准输出
注意:作业执行命令的结果中的标准输出和标准错误以邮件通过给相关用户
TIME: 定义出什么时候进行at这项任务的时间
HH:MM [yyyy-mm-dd]
noon,midnight,teatime(4pm)
tomorrow
now+#{minutes,hours,days,weeks}
HH:MM 如 2:00
在今天2:00进行,若今天时间已过,则明天此时执行任务
HH:MM YYYY-MM-DD 如 2:00 2019-09-20
规定在某年某月的某一天的特殊时刻进行该项任务
HH:MM [am|pm][Month] [date]
04pm March 17 3月17号下午4点
17:20 tomorrow 明天17.20
在某个时间点再加几个时间后才进行该项任务
now + 5 minutes|min
02pm + 3 days 第一个下午2点之后在加3天
执行方式:
1 交互式
2 输入重定向
3 at -f file
依赖于atd 服务,需要启动才能实现at任务
at 队列存放在/var/spool/at目录中
权限控制:
/etc/at.{allow,deny},控制用户是否能执行at任务
白名单/etc/at.allow 默认不存在,如果存在,只有该文件中的用户才能执行at命令
黑名单/etc/at.deny 默认存在,
如果白名单存在,黑名单无效
如果白名单不存在,在除黑名单中之外的用户可以使用at命令
如果两个文件都不存在,只有root可以执行at命令
cron:
周期性任务计划:cron
相关的程序包:
cronie:主程序包,提供crond守护进程及相关辅助工具
cronie-anacron:cronie的补充程序,用于监控cronie任务执行状况,
如cronie中的任务在过去该运行的时间点未能正常运行,则anacron会
随后启动一起此任务
crontabs:包含centos提供系统维护服务
确保crond守护处于运行状态:
centos7: systemctl status crond
centos6: service crond stadus
计划周期性执行的任务提交给crond,到指定时间会自动运行
系统cron任务:系统维护作业
/etc/crontab
用户cron任务:
crontab 命令
日志:/var/log/cron
系统cron任务:/etc/crontab
时间格式: * * * * *
分(0-59) 小时(0-23) day(1-31) month(1-12) week(0-6 或者1-7,周天是0或者7)
时间表示法:
1 特定值: 给定时间点有效取值范围内的值
2 * 每。。。
3 离散取值 #,#,#
4 连续取值 #-#
5 /# 指定步长,比如 0 /2 * * * 表示每2小时执行一次
特殊格式: @reboot 开机执行
@yearly 每年 = 0 0 1 1 *
@annually
@monthly
@weekly
@daily
@hourly
在etc下有相关脚本执行 /etc/cron.daily
/etc/cron.hourly
/etc/cron.monthly
/etc/cron.weekly
/etc/crontab
/usr/bin/run-parts dir 运行目录下所有可执行脚本
anacron系统:
运行计算机关机时cron不运行的任务,centos6 以后版本取消anacron服务
有crond服务管理
用户计划任务:
crontab:
每个用户都有专用的cron任务文件:/var/spool/cron/USERNAME
crontab [-u user] [-l|-r|-e][-i]
-l 列出所有任务
-e 编辑任务
-r 移除所有任务
-i 同-r 一同使用,以交互式模式移除指定任务
-u user 仅root 可以执行,指定用户管理cron任务
控制用户执行计划任务
/etc/cron.allow
/etc/cron.deny
规则同at
注意事项:
运行结果的标准输出和错误以邮件通知相关用户
对于cron任务来讲,%有特殊用途;如果在计划任务命令中要使用%。需要转义,
或者放置在单引号中(貌似无效)
或者将命令放在单独脚本中,计划任务中执行脚本即可
也可以将写好的计划任务脚本放在/etc/cron.d/ 下,系统自动执行
练习:
1、每周的工作日1:30,将/etc备份至/backup目录中,保存的文件名称格式
为“etcbak -yyyy-mm-dd-HH.tar.xz”,其中日期是前一天的时间
vim /root/bin/etcbackup.sh
#!/bin/bash
tar -Jcvpf /backup/etcbak-`date +%F-%H`.tar.xz /etc
chmod +x /root/bin/etcbackup.sh
crontab -e
30 1 * * 1-5 /root/bin/etcbackup.sh
2、每两小时取出当前系统/proc/meminfo文件中以S或M开头的信息追加至
/tmp/meminfo.txt文件中
crontab -e
0 */2 * * * cat /proc/meminfo|grep -Ei '^s|^m' >> /tmp/meminfo.txt
3、工作日时间,每10分钟执行一次磁盘空间检查,一旦发现任何分区利用率高
于80%,就执行wall警报
实验作业:
添加@reboot root reboot 计划任务之后修复