Linux进程与计划任务
- 进程
-
- 介绍
- 进程分类
- 进程基本状态和转换
- 进程优先级
- 进程管理工具
-
- ps命令
- uptime命令
- top命令
- free命令
- vmstat命令
- dstat命令
- iotop命令
- lsof命令
- kill命令
- Linux作业控制
- 并行
- 计划任务
-
- 单次计划任务
- 周期性计划任务
-
- cron介绍
- cron配置
- crontab命令
- 实验
进程
介绍
进程:Process,运行中的程序的一个副本,被载入内存的指令集合,是操作系统中进行保护和资源分配的基本单位。
#PID:Process ID,进程ID号,标记各个进程,存在生命周期。
#Task Struct:Linux内核存储进程信息的数据结构格式。
#进程都是由其父进程创建,第一个进程是init(CentOS7上是systemd),遵循CoW(写时复制)。
#多实例:一个进程运行多次。
线程:进程的组成部分,它代表了一条顺序的执行流。
携程:可以看作线程中的语句块(类似于函数)。
进程内存:
Page Frame:页框,类似于磁盘的块(block),用于存储页面数据,存储Page 4K。
LRU算法:近期最少使用算法,Least Recently Used,释放内存。
#CPU中的内存管理单元:MMU和TLB
IPC:进程间通讯
同一主机:signal、shm、semaphore
不同主机:socket、RPC、MQ
进程、线程和携程关系图

进程分类
守护进程:daemon,系统引导过程中启动,和终端无关的进程(一般为各类服务service)
前台进程:与终端相关,通过终端启动的进程。
#守护进程与前台进程可互相转换
进程基本状态和转换
创建状态:进程在创建时需要申请一个空白PCB(process control block进程控制块),向其中填写控制和管理进程的
信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称
为创建状态就绪状态:进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行
执行状态:进程处于就绪状态被调度后,进程进入执行状态 .
阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时 无法运行,进程受到阻塞。在满足请求时
进入就绪状态等待系统调用
终止状态:进程结束,或出现错误,或被系统终止,进入终止状态,无法再执行。
进程状态转换:
运行——>就绪:1.主要是进程占用CPU的时间过长,而系统分配给该进程占用CPU的时间是有限的。
2. 在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行时,该进程就被迫让出CPU,
该进程便由执行状态转变为就绪状态。
就绪——>运行:运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU。
运行——>阻塞:正在执行的进程因发生某等待事件而无法执行,则进程由执 行状态变为阻塞状态,如发生了I/O请求。
阻塞——>就绪:进程所等待的事件已经发生,就进入就绪队列。
以下两种状态是不可能发生的:
阻塞——>运行:即使给阻塞进程分配CPU,也无法执行,操作系统在进行调度时从就绪队列中选取,而非阻塞队列。
就绪——>阻塞:就绪态根本就没有执行,谈不上进入阻塞态。
进程优先级
系统优先级:system优先级,数字越小,优先级越高。
实时优先级:realtime优先级,数值越大,优先级越高。
nice优先级:基于轮询机制,RR。
CentOS优先级
进程管理工具
ps命令
ps:查看进程快照
命令风格:
UNIX选项:如-A,-e
BSD选项:如a,u
GNU选项:如--help
选项:
#默认显示当前终端进程
BSD风格常用选项
a:所有终端中的进程
x:包括不链接终端的进程
u:显示进程所有者的信息(包括user、VSZ,RSS等)
f:显示进程树
k|--sort 属性:对属性排序,属性前加-表示倒叙(eg:ps k-%mem,ps --sort=%mem)
o 属性:指定显示哪些属性,pid,cmd,%cpu,%mem等等(eg:ps o pid,%mem,cmd)
L:显示支持的属性列表
UNIX风格常用选项
-C cmd:查看指定命令进程,多个命令用逗号隔开
-L:显示线程
-e:显示所有进程,相当于-A
-f:显示完整格式程序信息
-F:显示更完整格式程序信息
-H:以进程层级格式显示
-u userlist:指定有效用户id或名称
-U userlist:指定真正的用户的id或名称
-g gid:指定有效的gid或组名称
-G gid:指定真正的的GID或名称
-p PID:显示指定PID的进程
输出属性:
VSZ:虚拟内存集,线性内存
RSS:常驻内存集,实际使用的
STAT:进程的状态表示
R:运行状态
S:可唤醒睡眠状态
D:不可唤醒睡眠状态
T:停止状态
Z:僵死状态,kill掉父进程可杀死僵死状态的进程
+:前台进程
l:多线程进程
L:内存分页并带锁
N:低优先级进程
<:高优先级进程
s:子进程会话发起者
常用选项及相关命令:
ps aux
ps -ef
ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
ps -ft pty/0 查看指定终端正在运行那些命令
ps -eo pid,ppid,%cpu,%mem,cmd --sort=-%mem | head 查看占用最多内存的进程
ps aux|grep vim 查看vim进程
pgrep vim 按模式查找vim进程的pid
pidof vim 按名称查找vim进程的pid
pmap 18875 查看进程号为18875对应的内存映射
cat /proc/18875/maps 查看进程号为18875对应的内存映射
uptime命令
uptime:显示当前时间,系统已启动时长,当前登录系统用户数量,系统平均负载(1、5、10分钟的平均负载)
#系统平均负载:指定时间间隔内运行队列中的平均进程数
#通常每个CPU内核的当前活动进程不应大于3,那么系统性能良好。如果每个CPU内核的任务数大于5,则性能有严重问题
#如果Linux主机是1个双核CPU,当load average为6时说明机器已被充分使用
top命令
top:进程管理工具
选项:
-d num 指定刷新时间间隔为num,默认为3秒
-b 显示所有进程
-n num 刷新num次后退出
-H 线程模式
排序:
P:以占CPU百分比,多的在上面
M:以占内存百分比,多的在上面
T:累计占CPU时长
首部信息(与uptime命令相同)显示:
uptime信息:l 命令
tasks及CPU信息:t 命令
CPU分别显示:1 (数字)
memory信息:m 命令
退出:q
修改刷新时间间隔:s
终止指定进程 :k
修改颜色:Z
保存文件:W,保存至用户家目录下隐藏文件.toprc
free命令
free:查看内存空间使用状态
选项:
-b 以字节为单位
-m 以MB为单位
-g 以GB为单位
-h 易读格式
-o 不显示-/+buffers/cache行(CentOS7中free命令没有此选项)
-s num 刷新间隔为num秒
-c num 刷新num次后退出
vmstat命令
vmstat:查看虚拟内存信息
输出信息:
procs:
r 可运行进程个数,与核心数有关
b 处于不可中断睡眠状态进程个数(被阻塞的队列长度)
memory:
swpd 交换内存的使用总量
free 空闲物理内存总量
buffer 用于buffer的内存总量
cache 用于cache的内存总量
swap:
si 磁盘交换至内存的数据速率(kb/s)
so 内存交换至磁盘的数据速率(kb/s)
io:
bi 从块设备读取数据到系统的速率(kb/s)
bo 保存数据至块设备的速率(kb/s)
system:
in 中断速率
cs 进程切换速率
cpu:
us 用户态使用的cpu时间比
sy 系统态使用的cpu时间比
id 空闲的cpu时间比
wa cpu等待磁盘写入完成时间
st 虚拟机偷取时间
dstat命令
dstat:系统资源统计(替代vmstat、iostat)
选项:
-c 显示CPU信息
-d 显示磁盘信息
-g 显示page相关统计数据
-m 显示memory相关统计数据
-n 显示network相关统计数据
-p 显示process相关统计数据
-r 显示io请求相关统计数据
-s 显示swapped相关统计数据
iotop命令
iotop:监视磁盘I/O使用状况的top类工具
#iotop具有与top相似的UI,其中包括PID、用户、I/O、进程等相关信息,可查看每个进程是如何使用IO
输出信息:
第一行:read和write速率统计
第二行:实际的read和write速率
第三行:参数如下
线程ID(按p切换为进程ID)
优先级
用户
磁盘读速率
磁盘写速率
swap交换百分比
IO等待所占的百分比
线程/进程命令
常用参数:
-o:是显示正在产生I/O的进程或线程,除了传递参数,可以在运行过程中按o键
-b:非交互模式,一般用来记录日志
-n NUM:设置检测的次数,默认无限,在非交互模式下很有用
-d SEC:设置每次检测的间隔,默认一秒,接收1.1之类的
-p PID:指定检测的进程/线程
-u user:指定检测某个用户产生的I/O
-P:仅显示进程
-a:显示累计的I/O,而不是带宽
-k:使用kB单位,而不是对人友好的单位,在非交互模式下,脚本编程有用
-t:加上时间戳,非交互模式
-q:禁止头几行,非交互模式,有三种方式
-q 只在第一次监测时显示列明
-qq 永远不显示列名
-qqq 永远不现实I/O汇总
交互式按键:
left和right方向键:改变排序
r:反向排序
o:切换至选项--only
p:切换至选项--processes
a:切换至--accumulated选项
q:退出
i:改变线程的优先级
lsof命令
lsof:list open files查看当前系统文件的工具
#在Linux环境下,一切皆文件,用户通过文件不仅可以访问常规数据,还可以访问网络连接和硬件。
#系统在后台都为该应用程序分配了一个文件描述符
参数:
-c <进程名>:列出指定进程打开的文件
例:lsof -c vim
-p <进程号>:指定进程号,可以查看该进程打开的文件
例:lsof -p `pidof vim`
-u:查看指定用户打开的文件
例:lsof -u root
+d:查看指定目录下被打开的文件,+D是递归查看
例:lsof +d /etc
-i <条件>:列出符合条件的进程(4、6、协议、:端口、@IP)
例:lsof -i :22
-n:不反向解析网络名字
-n <目录>:列出使用NFS的文件
实验:恢复已删除文件
lsof | grep /var/log/messages
rm -rf /var/log/messages
lsof | grep /var/log/messages
cat /proc/653/fd/4 :653代表的是进程的PIP号使用pidof cmd查看进程的IP号
cat /proc/653/fd/4 > /var/log/messages
#注意:只能恢复正在使用的文件,没有使用的文件恢复不了,需借助其他工具
kill命令
kill:向进程发送控制信号,以实现对进程的管理
显示当前系统可用信号:kill -l 或 trap -l
常用信号:man 7 signal
0) 用来错误检查,echo $?如果为0,则正常,为1不正常
实验:测试服务是否存在错误,如果存在错误则重启服务
kill -0 `pidof httpd | tr -s " " "\n" | sort -n |head -1` &>
/dev/null ||systemctl restart httpd
1)sighup 无需关闭进程而让其重读配置文件
2)sigint 终止正在运行的进程,相当于Ctrl+c
3)digquit 输入quit命令退出,Crtl+\
9)sigkill 强制杀死正在运行的进程
15)sigterm 终止正在运行的进程,输入kill不加信号默认为15
18)sigcont 继续执行
19)sigstop 后台休眠
相关命令:
killall <进程名>:将只要关于指定进程名的进程全部关闭
killall -0 <进程名>:测试某服务是否正常运行
pkill
-u UID:生效者
-U uid:真正发起运行命令者
-t tty:于指定终端相关的进程
-l:显示进程名
-a:显示完整格式的进程名
-P pid:显示指定进程的子进程
Linux作业控制
Linux作业:
前台作业:通过终端启动,且启动后一直占据终端
后台作业:可通过终端启动,启动后转入后台运行(释放终端)
作业控制:
Ctrl+z 运行中的作业转入后端休眠
cmd & 后端运行cmd命令
#后台作业虽然被送往后台运行,但仍与终端相关,退出终端后台作业会被关闭
nohup cmd &> /dev/null & 后台剥离终端运行cmd命令
jobs 查看当前终端所有作业
fg num 将num号作业调回前台
bg num 将送往后台的num号作业继续在后台运行
kill num 终止num号作业
并行
并行:同时运行多个进程,提高效率
实验:并行运行f1.sh、f2.sh、f3.sh
=====================================
vim all.sh
#!/bin/bash
f1.sh&
f2.sh&
f3.sh&
sh all.sh
=====================================
(f1.sh&);(f2.sh&);(f3.sh&)
=====================================
{f1.sh&f2.sh&f3.sh&}
=====================================
计划任务
单次计划任务
at命令:指定时间点,执行一次性任务,如果有标准输出,默认发邮件给用户
at服务:
#atd.service
centos7:systemctl status atd
centos6:chkconfig --list atd
格式:at [option] TIME
常用选项
-V:版本信息
-l:列出指定队列中等待运行的任务相当于atq
-d:删除指定的任务
-c:查看具体任务内容
-f file:从指定的文件中读取任务
-t time:时间格式
-m:任务完成后,会给用户发邮件,即使没有数据,也会有一个空邮件
时间可定义为:
now+{minutes,hours,days,weeks}:现在往后加多长时间执行一次任务
例:at now+10minutes
at> echo aaa
at> <EOF>
十分钟之后执行echo命令
创建任务时会自动创建文件:会创建一个随机编号的文件,关机重启任务也不会丢失
/var/spool/at/
允许或拒绝某用户使用计划任务
/etc/at.allow 默认没有此文件,如果有此文件,就看文件中是否有此用户,有则可以设定计划任务,如果
没有则不能定义计划任务,此文件优先级高,看了此文件不会再看deny文件
/etc/at.deny 如果没有allow文件,那么在deny文件中的用户不能定义计划任务,此文件中的用户是拒
绝使用计划任务的
#如果两个文件都不存在,那么只由root用户可定义计划任务
#run-parts dir:指定目录,将目录下的可执行文件全部执行一遍
支持输入重定向方式
at 12:00 << EOF
echo 123
echo 354
EOF
#at命令无法精确到秒,可以通过sleep、usleep等命令使时间精确到秒
周期性计划任务
cron介绍
cron:周期性执行某任务
#任务计划在单用户模式下是不执行的
确保crond守护进程处于运行状态
centos7:systemctl status crond
centos6:service crond status
计划周期性执行的任务提交给crond,到指定的时间会自动运行
系统cron任务:系统维护
/etc/crontab
用户cron任务
crontab命令生成
日志:/var/log/cron
cron配置
/etc/crontab文件中的格式,仅root用户修改此文件
# 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 0和7都是周日
# | | | | |
# * * * * * user-name command to be executed
分 时 天 月 周 用户 命令
*/10 * * * * root /data/bin/checkdisk.sh :每隔十分中就检查一次磁盘;*号表示每的意思,
*/10表示每10分钟,其他的都是每小时,每天等
30 2 1,10,20 * 0 root /data/check_disk.sh 如果天和周都有定义,就是或的关系,这个例子是
1,10,20号和周日的2点30分执行命令,如果想要
1,10,20,并且是周日在执行,那就在脚本里写一个判
断语句,date +%w判断是周几,返回的是数字
30 2 * 3-6,12 * root /bin/cat /var/log/messages 3到6月和12月的每天2点30分以root用户
身份执行命令
#任务计划中的命令必须是命令的绝对路径,一般情况都是编辑好脚本,这里写脚本的绝对路径运行脚本的
时间表示法:
给予特定的值
*:给定时间点上取值范围内的所有值
#,#,#:离散取值,1,10,20,23天
#-#:连续取值,1-25天
*/#:步长取值,*/10每十分钟
@reboot:下次重启前执行,开机的时候删,关机不会删
/var/spool/cron/ crontab创建的任务文件存放点,以用户名为文件名的任务文件
/var/log/cron 计划任务的日志文件,CMD字段为执行过的命令。
crontab命令
crontab命令:用户创建任务计划,通过界面编辑计划任务
-e:编辑
-u:仅root用户可运行,指定用户管理cron任务
-r:删除任务,全部删,要删单挑编辑文件
-l:列出cron任务
eg:当前用户为root,执行crontab -e
内容为:* * * * * /bin/cat /root/file1
错误的:* * * * * root /bin/cat /root/file1
#如果中间加上了用户,它会认为root也是一条命令,当执行时,没有root命令则会报错
#crontab默认使用vi编辑器,可使用export EDITOR=vim为创建的任务中加颜色,保存至/etc/profile.d/name.sh
#使用crontab -e创建的任务计划不需要指定用户,当前用户创建的任务
#可使用 crontab -u username -e:使用某用户身份为用户创建计划任务
#任务执行命令的结果中的标准输出和错误会以邮件方式通知给用户,建议多余的输出重定向至/dev/null
#对于cron任务来讲,%有特殊用途,如果在命令中要使用,需要转义,将%放置于单引号中,可不用转义,放入脚本中即可
控制用户权限执行任务
/etc/cron.allow|deny
#同样allow比deny优先级高,有了allow不会再看deny文件
实验
- 找出CPU占用最高的10个进程
[[email protected] ~]# ps aux --sort=-%cpu | head -n11
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 9683 0.5 10.0 3170416 187404 ? Sl 10:43 0:10 /usr/bin/gnome-shell
root 10817 0.2 4.0 1372264 75584 ? Sl 10:43 0:04 /usr/bin/gnome-software --gapplication-service
root 1 0.1 0.3 193944 7104 ? Ss 10:43 0:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 9 0.1 0.0 0 0 ? S 10:43 0:01 [rcu_sched]
root 6645 0.1 0.1 90392 3264 ? Ss 10:43 0:02 /sbin/rngd -f
root 6655 0.1 0.3 320024 6748 ? Ssl 10:43 0:01 /usr/bin/vmtoolsd
root 10790 0.1 1.3 566640 25656 ? Sl 10:43 0:02 /usr/bin/vmtoolsd -n vmusr
root 2 0.0 0.0 0 0 ? S 10:43 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 10:43 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 10:43 0:00 [kworker/0:0H]
[[email protected] ~]#
- crontab实现,在12月内,每天早上6-12点,每隔3小时0分钟执行一次/usr/bin/backup
[[email protected] ~]# crontab -e
0 6-12/3 * 12 * /usr/bin/backup
~
~
~
~
~
~
~