一、相关概念
1、进程的的基本定义
在自身的虚拟地址空间运行的一个独立的程序,从操作系统的角度来看,所有在系统上运行的东西,都可以称为一个进程。
2、进程的分类
系统进程:可以执行内存资源分配和进程切换等管理工作;该进程的运行不受用户的干预,即使是root用户也不能干预系统进程的运行。
用户进程:通过执行用户程序、应用程序或内核之外的系统程序而产生的进程,此类进程可以在用户的控制下运行或关闭。
交互进程:由一个shell终端启动的进程,在执行过程中,需要与用户进行交互操作,可以运行于前台,也可以运行在后台。
批处理进程:该进程是一个进程集合,负责按顺序启动其他的进程。
守护进程:守护进程是一直运行的一种进程,经常在linux系统启动时启动,在系统关闭时终止。例如:(1)httpd进程,一直处于运行状态,等待用户的访问;(2)crond进程,这个进程类似与windows的计划任务,可以周期性的执行用户设定的某些任务。
二、涉及进程的相关指令
在linux系统中,进程ID(用PID表示)是区分不同进程的唯一标识,它们的大小是有限制的,最大ID为32768,用UID和GID分别表示启动这个进程的用户和用户组。所有的进程都是PID为1的init进程(centos7.x版本是systemd进程)的后代。内核在系统启动的最后阶段启动init进程,因而,这个进程是linux下所有进程的父进程,用PPID表示父进程。
1、top指令
具体每个参数的含义在常用指令集合有详细介绍了,另外补充一下,在top命令下摁“F”可以定制功能,有“*”是已经定制的,按空格键可以定制,按ESC退出。
2、ps指令
ps -ef指令下会显示此时进程的信息,中括号括起来大部分一般是系统进程,系统进程一般排在前面,用户一般无法参与。
另外还有常用的ps -aux命令显示更详细一些。
ps -ef|grep sshd #过滤查看某进程(sshd)的信息
3、pgrep指令
pgrep是通过程序的名字来查询进程PID的工具,支持模糊匹配,它通过检查程序在系统中活动的进程,输出进程属性匹配命令行上指定条件的进程的ID
pgrep -f sshd #查看sshd进程对应的所有ID
ps -ef|grep sshd #像之前提到的ps指令也可以查看,但不够简洁
4、lsof指令
经常用来查看某个进程打开多少文件,解决某个进程超过最大值而可能出现诸多问题。
lsof -p PID #PID是进程号,通过进程号显示程序打开的所有文件及依赖相关进程
lsof -i #通过监听指定的协议、端口、主机等信息,显示符合条件的进程信息。一个端口对应的那些进程,例如lsof -i :80/25/22 lsof -i tcp:80/25/22
lsof -c 进程名称 #例如sshd,类似PID,但比-p显示更多
lsof -c sshd|wc -l #查看sshd打开了多少个文件
5、kill指令
用kill终止一个进程
kill [信号类型] 进程PID
信号类型有很多种,可以通过kill –l查看所有信号类型。常用的信号类型有SIGKILL,对应的数字为9,还有SIGTERM和SIGINT,对应的数字分别为15和2。
kill -9 进程PID #表示强制结束进程。
kill -2 进程PID #表示结束进程,但是并不是强制性的,常用的ctrl+c组合键发出的就是一个kill -2的信号。
kill -15 进程PID #表示正常结束进程,是kill的缺省选项,也就是kill不加任何信号类型时,默认类型就是15。
kill -0 进程PID #写脚本时候用,对服务、进程的状态进行试探,对一个进程进行是否存在。执行-0后,通过 echo $? 指令,返回值为0则执行成功,其他数字是执行不成功。
6、killall指令
用killall终止一个进程。
killall也是关闭进程的一个命令,与kill不同的是,killall后面跟的是进程的名字,而不是进程的PID,因而,killall可以终止一组进程。
killall [信号类型] 进程名称 #信号类型与kill一致,进程名称例如java、httpd、mysqld、sshd、sendmail等。
三、任务调度进程crond
1、相关概念
crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似。
2、分类
Linux下的任务调度分为两类,系统任务调度和用户任务调度。
(1)系统任务调度
系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。当然还有cron.各种副文件,都是系统直接配置好的,可以自己修改。
(2)用户任务调度
用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。
3、crond的使用(针对用户任务调度)
(1)crontab常用的使用格式
crontab [-u user] [file]
crontab [-u user] [-e /-l / -r /-i ] #没有跟用户默认执行当前用户
常用组合: crontab -e ;crontab -l
选项含义如下:
-u user:用来设定某个用户的crontab服务,例如,“-u ixdba”表示设定ixdba用户的crontab服务,此参数一般由root用户来运行。
file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。 -e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。
-l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。
-r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。
-i:在删除用户的crontab文件时给确认提示。
(2)crontab文件的含义
用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段。
minute: 表示分钟,可以是从0到59之间的任何整数。
hour:表示小时,可以是从0到23之间的任何整数。
day:表示日期,可以是从1到31之间的任何整数。
month:表示月份,可以是从1到12之间的任何整数。
week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
在以上各个字段中,还可以使用以下特殊字符:
星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”。
中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”。
正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。
(3)crontab应用举例
0 */3 * * * /usr/local/apache2/apachectl restart #表示每隔3个小时重启apache服务一次。
30 3 * * 6 /webdata/bin/backup.sh #表示每周六的3点30分执行/webdata/bin/backup.sh脚本的操作。
0 0 1,20 * * fsck /dev/sdb8 #表示每个月的1号和20号检查/dev/sdb8磁盘设备。
10 5 */5 * * echo "">/usr/local/apache2/log/access_log 表示每个月的5号、10号、15号、20号、25号、30号的5点10分执行清理apache日志操作。
(4)使用crontab工具的注意事项
<1>注意环境变量问题:有时我们创建了一个crontab(他不会自动加载环境变量),但是这个任务却无法自动执行,而在命令行手动执行这个任务却没有问题,这种情况一般是由于在crontab文件中没有配置环境变量引起的。这个时候我们需要在自己的/var/spool/cron/crontab文件下手动添加环境变量,例如:source /etc/profle(系统全局环境变量) source /root/.bashrc(用户环境变量)
问题比如在shell脚本里可以执行,但是放到crontab里面就不行了。
<2>注意清理系统用户的邮件日志:可以在crontab文件中设置如下形式,忽略日志输出:
0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1
<3>系统级任务调度与用户级任务调度:系统级任务调度主要完成系统的一些维护操作(比如定时重启机器),用户级任务调度主要完成用户自定义的一些任务,可以将用户级任务调度放到系统级任务调度来完成(不建议这么做),但是反过来却不行。
(5)使用事例
<1>在root用户下,给huoserver用户进行用户级任务调度工作,首先进入编辑页面。
<2>写入的大致内容为:每个月的5号、10号、15号、20号、25号、30号的5点10分执行清理日志操作。
<3>这时我们发现在/var/spool/cron/ 目录下出现了我们所设置的用户名的文件,内容也是我们刚才输入的。
<4>我们可以用tail -f /var/log/cron 命令来查看定时执行的任务