创建计划任务

前言

计划任务,是系统自动完成任务的一种方式。其原理就像是闹钟一样,到了我们指定的某一个时间点,系统就会自动的执行某种操作,实现我们想要达到的目的。在实际生产中有很多这样类似的例子,例如,定时发送邮件,定时备份某个目录,定时检查计算机的磁盘利用率并及时提醒管理员。

Linux 操作系统提供了这样的计划任务机制,使我们能够灵活的制定计划任务,以达到我们实际生产中的目的。

目录

我们将从以下几个方面系统地介绍Linux中地计划任务。

  • 一次性计划任务–at命令
  • 周期性计划任务–cron命令
  • anacron 系统
  • 普通用户的cron

一次性计划任务——at命令

就像一个定时闹钟一样,Linux中提供了能够在某一个特定时刻执行某条计划任务的命令,就是at命令。在使用at 命令的时候,要首先检查at命令是否已经安装,并且已经启动。但是CentOS 7 与CentOS 6中的服务名称已经有所变化,包括后面的cron服务也是一样,这里我们以at命令为例详细的解释一下。

CentOS 7 中at命令

# 查询at命令是否已经安装rpm -ql at

/etc/at.deny								#at命令的黑名单/etc/pam.d/atd
/etc/sysconfig/atd
/usr/bin/at								#at的一些命令/usr/bin/atq								#at的一些命令/usr/bin/atrm
/usr/bin/batch
/usr/lib/systemd/system/atd.service 		#at命令服务的名称/usr/sbin/atd
/usr/sbin/atrun
......										#at命令的一些文档,此处省略/var/spool/at								#at任务的暂存目录/var/spool/at/.SEQ
/var/spool/at/spool#查询服务是否已经启动systemctl status atd						

#如果没有启动,将其启动systemctl start atd

CentOS 6 中at 命令

#查询at 命令是否已经安装rpm -ql at

/etc/at.deny								#at命令的黑名单/etc/pam.d/atd
/etc/rc.d/init.d/atd						#at命令的服务名称/etc/sysconfig/atd
/usr/bin/at									#at命令的一些命令/usr/bin/atq								#at命令的一些命令/usr/bin/atrm								#at命令的一些命令/usr/bin/batch
/usr/lib64/pm-utils/sleep.d/56atd
/usr/sbin/atd
/usr/sbin/atrun
......
/var/spool/at								#计划任务的暂存目录/var/spool/at/.SEQ
/var/spool/at/spool# 查询命令是否已经启动service atd status

atd (pid  2089) is running...# 如果命令没有启动的话,将其启动systemctl start atd

at 命令的通用格式 at [option] TIME

at命令的常用选项

-V 显示版本信息:
-l: 列出指定队列中等待运行的作业;相当于atq
-d: 删除指定的作业;相当于atrm
-c: 查看具体作业任务
-f /path/from/somefile:从指定的文件中读取任务
-m:当任务被完成之后,将给用户发送邮件,即使没有标准输出

注意:作业执行命令的结果中的标准输出和错误以邮件通知给相关用户

TIME 定义什么时候执行at 这项任务的时间

at命令常用的时间格式

时间格式 案例 解释
HH:MM 02:00 在今日的 HH:MM 进行,若该时刻已过,则明天此时执行任务
HH:MM YYYY-MM-DD 02:00 2016-09-20 规定在某年某月的某一天的特殊时刻进行该项任务
HH:MM[am pm] [Month] [Date] 04pm March 17 17:20 tomorrow 指定具体的日期和时间
HH:MM[am或pm] + number [minutes或hours或days或weeks] now + 5 minutes 在某个时间点再加几个时间后才进行该项任务

at 命令的执行方式

在使用at命令过程中有多种方式,使用起来比较灵活。下面我们就介绍一下这几种方式的使用,实际上大同小异,可以相互比较着去理解。

交互式

交互式定义计划任务的方式,是一种比较常用的也比较简单的方式。管理员可以在命令行直接输入需要定时执行的任务即可。

注意:交互式定义计划任务的时候,Ctrl+D 退出命令

#使用at命令定义一个计划任务[[email protected] ~]#at 10:55at> rm -rf /app/hello/at> <EOT>
job 1 at Mon Aug 28 10:55:00 2017#使用-l 选项查看计划任务是否设置成功[[email protected] ~]#at -l
1	Mon Aug 28 10:55:00 2017 a root#查看/var/spool/at 下是否生成了计划任务的临时文件#临时文件在任务执行成功之后,会自动消失[[email protected] ~]#ls /var/spool/at
a00001017e756f  spool

下面我们看一张动态图的效果

输入重定向

其实at 命令在制定计划任务的时候,接收的就是标准输入的内容,不管是使用交互式的时候,还是其他,因此将标准输入重定向给at命令,也可以轻松实现定义计划任务。

#利用管道[[email protected] ~]#echo "echo c;echo d" | at 12:00#利用多行重定向[[email protected] ~]#at 12:00 << EOF
> echo a
> echo d
> EOF
job 2 at Mon Aug 28 12:00:00 2017

从文件中读入

读取标准输入还有一种方式就是从文件中读取,at命令同样支持这种方式。

#定义一个计划任务文件[[email protected] ~]#cat f1echo a 
echo b
rm -rf /app/hello/

将计划任务文件中计划任务读取出来,然后使用at命令创建计划任务[[email protected] ~]#at -f f1 12:00

at 命令 白名单 黑名单

  • 白名单:/etc/at.allow 默认不存在,只有该文件中的用户才能执行at命令
  • 黑名单:/etc/at.deny 默认存在,拒绝该文件中用户执行at命令,而没有在at.deny 文件中的使用者则可执行
  • 如果两个文件都不存在,只有 root 可以执行 at 命令,如果两个文件都存在,则at.deny文件失效,只有at.allow文件中白名单可以执行at命令,不在allow文件中的用户(除了root),都不能执行at命令。如果at.allow文件为空,则所有的用户(除了root)都不能执行at命令,如果两个文件都不存在,则只有root用户可以执行at命令,其余用户统统拒绝。

周期性的计划任务 cron

at命令只能定义一次计划任务,并在某一个时间点执行,执行结束之后,如果我们还想要重复这一操作,就需要重新定义一次计划任务,这样的方式在实际使用过程中具有很大的局限性,所以就需要用到周期性的计划任务 cron 相关的程序包: cronie: 主程序包,提供crond守护进程及相关辅助工具 cronie-anacron:cronie的补充程序,用于监控cronie任务执行状况,如cronie中的任务在过去该运行的时间点未能正常运行,则anacron会随后启动一次此任务 crontabs:包含CentOS提供系统维护任务

相关的服务,在CentOS 6 和CentOS 7中的名称是不一致的。相关的查询方法,可以参考at命令查询方式,都是相似的。

周期性的计划任务 分为三种类型 系统的计划任务,anacron 计划任务,普通用户的计划任务cron

系统的计划任务

系统的计划任务,主要定义在/etc/crontab文件中,crontab文件内容如下所示,这里描述了我们在定义系统计划任务过程中需要遵循的格式,其实对于普通用户的计划任务的格式也是按照这种方式的,只不过系统的计划任务只能右root用户来定义,普通用户是不能操作这个配置文件的。

SHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=root								# 默认的邮件发送# 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	# |  |  |  |  |		.---- username		# |  |  |  |  | 	|# *  *  *  *  * user-name  command to be executed
 # 注意,精确到分钟,不能精确到秒

我们使用另外一张图来详细的了解一下,crontab文件的格式内容。

时间的表示有多种方法

(1) 特定值 给定时间点有效取值范围内的值。 如 10 13 25 3 * mage rm -rf /app/hello

(2) * 给定时间点上有效取值范围内的所有值
表示“每…” 如: * 13 25 3 0 mage rm -rf /app/hello

(3) 离散取值
#,#,# 如: * 13 25 3 0 mage rm -rf /app/hello

(4) 连续取值
#-#  如: * 13-15 25 3 0 mage rm -rf /app/hello

(5) 在指定时间范围上,定义步长
/##即为步长 */10 每10分钟小时

系统支持的一些计划任务命令

系统本身支持一些常用的计划任务命令,使用这些命令可以迅速地指定计划任务。

@reboot 	Run once after reboot.
@yearly 	0 0 1 1 * @annually 	0 0 1 1 *@monthly	0 0 1 * *@weekly		0 0 * * 0
@daily 		0 0 * * *@hourly 	0 * * * *

例如我们想在系统的每次重启之后,清除日志文件夹下的所有的日志文件(当然,实际生产中可不要这样做啊!!),使用系统提供的计划任务名称会很好方便的实现,配置文件如下所示。

SHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=root								# 默认的邮件发送# 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	# |  |  |  |  |		.---- username		# |  |  |  |  | 	|# *  *  *  *  * user-name  command to be executed
 @reboot root  rm -rf /var/log/*
 @yearly root  rm -rf /var/log/*# 实际上我们就是使用  @yearly 替代了0 0 1 1 *  而已

查看我们定义的计划任务是否已经成功执行,可以查看系统的计划任务日志:/var/log/cronLinux 系统中有一些默认的计划任务,这些计划任务定义在下面的这些配置文件中,可以使用root用户去查看。

系统的计划任务:
/etc/crontab
/etc/cron.d/ 	配置文件
/etc/cron.deny  cron黑名单
/etc/cron.hourly/ 	每小时执行的任务脚本
/etc/cron.daily/ 	每天都要执行的任务脚本
/etc/cron.weekly/	每周都要执行的任务脚本
/etc/cron.monthly/	每月都要执行的任务脚本

小贴士

周期性的计划任务也有黑名单和白名单的设置,他们位于/etc/cron.deny 和 /etc/cron.allow ,关于黑名单和白名单与at命令的使用是一致的,这里不再重复介绍。

如果我们不想每次都去编辑 /etc/crontab 文件来创建计划任务的话,还有另外一种方式,我们可以按照crontab的格式写成配置文件,然后放在/etc/cron.d/目录下,这样系统也会每次扫描,并定时执行。这与在crontab 中编写计划任务是一致的。

anacron 计划任务

anacron 计划任务是对cron计划任务的一种补充。cron计划任务的作用是定义计划任务,并保证周期性的执行,但是这是有个前提的,那就是服务器必须是在开机的情况下,如果cron计划任务本应该执行的时候,服务器处在关机状态的话,计划任务又怎么能够执行呢?这时anacron计划任务的作用就凸显出来了。
anacron 并不能指定何时执行某项任务, 而是以天为单位或者是在开机后立刻进行 anacron 的动作,他会去侦测停机期间应该进行但是并没有进行的 cron服务,如果有就将该任务执行一遍,然后就自动停止。

anacron 由配置文件实现,在/etc/anacrontab按照固定格式定义一些计划任务,这些任务就会在开机之后按照设定好的计划去运行。

[[email protected] app]#cat /etc/anacrontab 
# /etc/anacrontab: configuration file for anacron# See anacron(8) and anacrontab(5) for details.SHELL=/bin/shPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=root# the maximal random delay added to the base delay of the jobsRANDOM_DELAY=45# the jobs will be started during the following hours onlySTART_HOURS_RANGE=3-22#period in days   delay in minutes   job-identifier   command1	5	cron.daily		nice run-parts /etc/cron.daily
7	25	cron.weekly		nice run-parts /etc/cron.weekly
@monthly 45	cron.monthly		nice run-parts /etc/cron.monthly

/etc/anacrontab中,各个字段的意思

字段 代表的含义
period in days 如果在这些日子里没有运行这些任务
delay in minutes 在重新引导后等待这么多分钟后运行它
job-identifier 任务识别器,在日志文件中标识
command 要执行的任务

系统中原有的anacron计划任务 由/etc/cron.hourly/0anacron执行,当执行任务时,更新/var/spool/anacron/cron.daily 文件的时间戳

用户的cron:

普通用户也可以来制定属于自己的计划任务,不过普通用户不能直接编辑 /etc/crontab 配置文件,只能使用命令来实现,

crontab命令定义,每个用户都有专用的cron任务文件:/var/spool/cron/USERNAME,如果用户创建了cron任务,在/var/spool/cron/ 下面就会生成一个与用户名一致的临时文件,里面记录了需要执行的计划任务。

crontab命令的使用方式crontab [-u user] [-l | -r | -e] [-i]

-l: 列出所有任务;
-e: 编辑任务;
-r: 移除所有任务;
-i:同-r一同使用,以交互式模式移除指定任务
-u user: 仅root可运行,指定用户管理cron任务

下图演示了如何使用crontab 命令来创建计划任务,以及删除计划任务。

在动图的演示过程中,我们看到/var/spool/cron/这个路径普通用户是没有权限直接访问的应该使用root用户来访问。使用 -r 结合 -i 选项可以交互式删除计划任务。

综上:在使用计划任务的过程中有一点需要注意,如果计划任务在执行的过程中产生了标准输出,系统是不知道应该输出到哪个终端的,所以只能以邮件的形式,发送给计划任务的用户。也就是说,计划任务是以谁的名义执行的,邮件就会发送给谁。因此,如果在创建计划任务过程中使用了脚本的话,最好屏蔽掉标准输出,这样就不会有多余的邮件信息。

个人博客地址:http://www.pojun.tech/ 欢迎访问

时间: 2024-12-16 12:38:36

创建计划任务的相关文章

自动创建计划任务之删除7天以前的备份文件批处理

本文的产生是在写个人网站备份脚本的时候看到的,留下来作为参考 问题场景:由于我的公司服务器太多,之前建立的每日备份日志文件日积月累会很大. 而且不需要保留那么多,按公司要求只需要保留一个星期的即可. 1.那么有什么方法自动删除7天以前备份的*.log文件呢? 2.服务器过多,不可能一一手动创建,有没有自动完成这个创建计划任务的批处理呢? 首先要解决的是自动删除7天以前备份的log文件,然后创建一个可以自动创建一个每 周指定日期指定时间运行一次该自动删除的批处理 一:删除7天以前备份的文件 命令

linux crontab创建计划任务

1.编辑计划任务 编辑crontab文件 crontab -e 2.查看计划任务日志 查看crontab日志 tail -100f /var/log/cron 3.创建计划任务格式 (1)基本格式 : * * * * * command 分 时 日 月 周 命令 第1列表示分钟1-59 每分钟用*或者 */1表示 第2列表示小时1-23(0表示0点) 第3列表示日期1-31 第4列表示月份1-12 第5列标识号星期0-6(0表示星期天) 第6列要运行的命令 (2)crontab文件的一些例子:

Win7系统如何创建计划任务的小技巧(图文)

题描述:Win7系统如何创建计划任务,Win7的计划任务可以执行自动关机么?任务计划,可以将任何脚本.程序或文档安排在某个时间运行.“任务计划”在每次启动windows系统的时候自动启动(默认Task Scheduler服务是开启的)并在后台运行.使用“任务计划”可以完成以下任务: 计划让任务在每天.每星期.每月或某些时刻(例如系统启动时)运行.更改任务的计划.停止计划的任务.自定义某个任务在某个时刻的运行方式. 任务计划主界面介绍: 1,点击“开始→控制面板→系统和安全→管理工具→任务计划”.

linux如何创建计划任务

做运维怎么能不懂创建计划任务! 1.at:用来创建临时任务,任务完成后命令不再生效 最常见的就是服务器的关机或重启了 [[email protected] 桌面]# at 19:00 at> /sbin/shutdown -h now<EOT>  这里最好输入命令的绝对路径 如果不知道命令的绝对路径可以通过which+空格+命令查看 job 4 at 2017-02-27 19:00 ps:红色字体为输入命令绝对路径后Ctrl+D后自动生成 查看命令可以用atq或者at -l [[ema

使用C#创建计划任务(How to create a Task Scheduler use C# )

需求:在不定时间段运行多个后台程序(winfrom,wpf,console,等等)用于更新数据. 问题:为什么要使用计划任务,而不直接在程序中使用一个计时器来出发呢? 答:最明显的一点,使用计时器程序一直在后台运行着,但需求中只需要一天运行一次,或一个月运行一次.一直后台跑着计时这不白浪费CPU资源么. 解决方案: 1.使用windows自带的计划任务 在控制面板中可以看到,手动新建计划任务. 2.使用微软自带的类库TaskScheduler("c:\windows\system32\taska

100小时练习配置---ME61创建计划独立需求的时候日期在有效工厂之后

在SAP PP模块用事务码ME61创建计划独立需求的时候会报日期在有效工厂之后的这个错误,如下图: 这是因为在创建工厂数据的时候工厂日期没有更改造成的,路径为:SPRO ->企业结构 ->定义 ->后勤-常规 ->定义工厂 找到都应的工厂然后修改对应的工厂日历:如下图: 把工厂日历更改为对应的需求日历,我这是改为CN就可以了. 原文地址:https://www.cnblogs.com/wild-peng/p/12658709.html

在Spring3中使用注解(@Scheduled)创建计划任务

Spring3中加强了注解的使用,其中计划任务也得到了增强,现在创建一个计划任务只需要两步就完成了: 创建一个Java类,添加一个无参无返回值的方法,在方法上用@Scheduled注解修饰一下: 在Spring配置文件中添加三个<task:**** />节点: 最后说明一下,第一步创建的Java类要成为Spring可管理的Bean,可以直接写在XML里,也可以@Component一下 计划任务类: /** * com.zywang.spring.task.SpringTaskDemo.java

微软私有云系列-----创建计划

配置计划 进入<计划> 界面,点击<创建新的宿主计划>. 创建名称为:<计划>,点击<向右箭头>. 勾选 <虚拟机云>.<SQL Server>.<MySQL>,点击 <向右箭头>. 点击<勾> 按钮. 正在创建. 成功创建. 点击"计划服务"中的 <虚拟机云>. 在VMM管理器服务器中,选择 <SCVMM.CONTOSO.COM>,在虚拟机云中选择 &l

Windows任务计划创建计划,定时执行PowerShell命令

[环境介绍] 操作系统:Windows Server 2012 R2,64位操作系统 PowerShell版本:PowerShell 1.0 脚本位置:C:\BackUp.ps1 启动目录:C:\Windows\SysWOW64\WindowsPowerShell\v1.0\PowerShell.exe [步骤图] 1.打开Windows任务计划 2.点击“创建任务” 3.输入“名称”,“配置”选择你对应的系统配置即可. 4.选择“触发器"选项卡,点击”新建“按钮 5.根据自己的需求,填写完触发