天天看点

Linux进程与计划任务进程计划任务实验

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
           

进程、线程和携程关系图

Linux进程与计划任务进程计划任务实验

进程分类

守护进程:daemon,系统引导过程中启动,和终端无关的进程(一般为各类服务service)
前台进程:与终端相关,通过终端启动的进程。
#守护进程与前台进程可互相转换
           

进程基本状态和转换

创建状态:进程在创建时需要申请一个空白PCB(process control block进程控制块),向其中填写控制和管理进程的
		信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称
		为创建状态就绪状态:进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行 
执行状态:进程处于就绪状态被调度后,进程进入执行状态 .
阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时 无法运行,进程受到阻塞。在满足请求时
		进入就绪状态等待系统调用 
终止状态:进程结束,或出现错误,或被系统终止,进入终止状态,无法再执行。
           

进程状态转换:

Linux进程与计划任务进程计划任务实验
运行——>就绪:1.主要是进程占用CPU的时间过长,而系统分配给该进程占用CPU的时间是有限的。
		   2. 在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行时,该进程就被迫让出CPU,
		   	  该进程便由执行状态转变为就绪状态。
就绪——>运行:运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU。
运行——>阻塞:正在执行的进程因发生某等待事件而无法执行,则进程由执 行状态变为阻塞状态,如发生了I/O请求。
阻塞——>就绪:进程所等待的事件已经发生,就进入就绪队列。
以下两种状态是不可能发生的:
	阻塞——>运行:即使给阻塞进程分配CPU,也无法执行,操作系统在进行调度时从就绪队列中选取,而非阻塞队列。
	就绪——>阻塞:就绪态根本就没有执行,谈不上进入阻塞态。
           

进程优先级

系统优先级:system优先级,数字越小,优先级越高。
实时优先级:realtime优先级,数值越大,优先级越高。
nice优先级:基于轮询机制,RR。
           

CentOS优先级

Linux进程与计划任务进程计划任务实验

进程管理工具

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文件
           

实验

  1. 找出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] ~]# 
           
  1. crontab实现,在12月内,每天早上6-12点,每隔3小时0分钟执行一次/usr/bin/backup
[[email protected] ~]# crontab -e

0 6-12/3 * 12 * /usr/bin/backup
~                                                                                                                                      
~                                                                                                                                      
~                                                                                                                                      
~                                                                                                                                      
~                                                                                                                                      
~                                                                                                                                      
~                                                                                                                                                                                                                                                                                                         
           

继续阅读