Linux计划任务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux计划任务相关的知识,希望对你有一定的参考价值。

一、什么叫计划任务

计划任务,字面意思理解就是在约定好的时间执行已经计划好的工作。在Linux中我们经常使用cron服务来完成这项工作。比如我们可以使用cron来做一个每天晚上12点备份一个日志文件,这就是个计划任务。

二、计划任务的好处

像一些做运维工作的,平时会有很多重复工作,如定点备份,定期重启服务,上线服务,定期检测等等,而这些任务有的需要在半夜进行,我们如果再等到半夜去操作会很累,很繁琐,所以我们这个时候就要用到计划任务了,只要我们把计划任务写好,我们就可以喝喝茶,干点其他事情了,也就不需要熬夜加班了。

三、计划任务的类型

1.系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存
2.个人执行的工作:某个用户定期要做的工作,例如每隔10分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置。

四、计划任务的实现

常用语执行计划任务的命令——at,batch,与周期性任务相关的命令crontabs.
1.at命令和batch命令的区别
at命令旨在特定的之间执行任务;batch命令设置的任务由系统选择空闲时间去执行,空闲时间默认为cpu利用率小于0.8的时候
2.at命令
at的任务是否能运行依赖于atd服务
我们可以先查看下atd服务是否运行
centos6:service atd status
centos7:systemctl status atd

语法
at(选项)(参数)
选项
-f:指定包含具体指令的任务文件;
-q:指定新任务的队列名称;
-l:显示待执行任务的列表;
-d:删除指定的待执行任务;
-m:任务执行完成后向用户发送E-mail。
实例
技术分享图片
技术分享图片
at命令后想要执行程序的确切时间,然后回车
接着在>后输入你想要执行的命令,最后用Ctrl+d组合键退出at,像图中它就会在16:54执行ls,然后把结果发给root,我们可以在/var/spool/mail/root中查看
我们在时间后跟上tomorrow让它在明天某个时间执行,或者跟上确切日期 17:04 04/04/2018 这就是让它在2018年4月3日17:04执行
或者at now +10 minutes 十分钟后执行
当然不止minutes这个关键词可以使用,下面的关键词都可以使用
minutes:表示《分钟》。

hours:表示《小时》。

days:表示《天》。

weeks:表示《星期》。

months:表示《月》。

years:表示《年》。

atq和atrm命令:列出和删除正在等待执行的at任务
我们每次使用at命令指定延时执行的命令,at都会给其分配一个job编号,比如上面的例子中我们at任务编号就是4,下面我就给大家演示下具体如何操作
技术分享图片
把任务删除后就不会再去执行了。
我们使用at -l 同样可以查看要延时执行的任务
at还有黑名单和白名单功能

(黑名单):当仅/etc/at.deny 存在时(默认)写入deny的用户不能配置at
(白名单):当/etc/at.allow存在时/etc/at.deny失效,只有写在allow中的用户才能配置at
当/etc/at.allow及/etc/at.deny都不存在时,仅有root才能配置at
bath命令的用法和at相似,这里就不再介绍了。

2.crontab命令

之前我们介绍了at命令,在这里我就要跟大家介绍一个更强大的命令了,就是crontab,我们使用at命令只能执行某个命令一次,而crontab却可以重复执行命令,例如:每分钟,每小时,每天,每周等。

crontab其实是一个命令,用来读取和修改名为crontab的文件。这个crontab文件包含了你要定时执行的程序列表,也包含了执行的时刻。

实际上,有两个命令,一个叫crontab,一个叫cron。crontab用于修改crontab文件,cron用于实际执行定时的程序。
有三个常用参数:

-e:修改crontab文件。

-l:显示crontab文件。

-r:删除crontab文件

/etc/crontab 系统级计划任务的主配置文件
仅能通过 root定义,不过可以以普通用户的身份去执行计划任务中的命令。
内容如下:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# 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
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed

前四行是用来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用哪个shell,这里是bash,第二行PATH变量指定了系统执行命令的路径,第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户,第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。
下面的注释则是配置文件格式,以及每一个※所对应的含义。
在这里我就跟大家详细介绍下每一段的定义:
第一段应该定义的是:分钟,表示每个小时的第几分钟来执行。范围是从0-59
第二段应该定义的是:小时,表示从第几个小时来执行,范围是从0-23
第三段应该定义的是:日期,表示从每个月的第几天执行,范围从1-31
第四段应该定义的是:月,表示每年的第几个月来执行,范围从1-12
第五段应该定义的是:周,表示每周的第几天执行,范围从0-6,其中 0表示星期日。
每六段应该定义的是:用户名,也就是执行程序要通过哪个用户来执行,这个一般可以省略;
第七段应该定义的是:执行的命令和参数。

我们在文件的最后一行添加内容如:
5 * * * * ls
就是指定每小时的第5分钟执行一次ls命令
我们也可以在指令前添加用户:
0 */2 * * * user1 ls

指定每两个小时以user1身份执行一次ls
我们也可以写一些每天要执行的脚本文件放在一个目录下:
30 5 * * * root run-parts /etc/cron.daily
指定每天的 5:30 执行/etc/cron.daily目录下的所有可执行文件(如果要单独执行某个脚本需要把run-parts,后面跟上脚本名就可以了)
我们需要记住几个特殊符号的含义:

"*"代表取值范围内的数字,
"/"代表"每",

"-"代表从某个数字到某个数字,

","分开几个离散的数字
那么在每周一至周五的10:30开始,每隔2小时重复一次就是
30 10-23/2 * * 1-5
PS:我们每次修改完crontab都需要重启服务才能生效。我们制定的脚本也都要给加上执行权限,不然是无法执行的。
重启命令如下:
/etc/rc.d/init.d/crond restart #重启

/etc/rc.d/init.d/crond reload #不中断服务,重新载入配置
我们还有一种增加调度任务的方法就是:
crontab -e 然后写入相应的计划任务,写完后保存退出就可以了,这种方法写的调度任务是在/var/spool/cron下生成一个与此用户同名的文件,此用户的cron信息都记录在这个文件中,这个文件是不可以直接编辑的,只可以用crontab -e 来编辑。
PS:cron启动后每过一份钟读一次这个文件,检查是否要执行里面的命令。因此此文件修改后不需要重新启动cron服务。
crontab -r 删除全部计划,不跟参数是删除当前用户的计划,跟用户名则是删除某个用户的计划。

以上是关于Linux计划任务的主要内容,如果未能解决你的问题,请参考以下文章

Linux系统管理10——进程和计划任务管理

linux中的进程于计划任务管理

Linux/Centos7系统管理之进程与计划任务管理

Linux——进程和计划任务管理

Fragment 中的计划任务将 getActivity 返回为 null

Linux系统之守护进程和计划任务