在linux上定期执行命令、脚本cron,crontab,anacron

人类把时间做了切割,想象一条笔直的线永远向前,本来这条直线上什么都没有,但是人类根据时间的长短(单位)在这条直线上做了密密麻麻的标记(世纪-年-月-日-时-分-秒-纳秒......),通过这样的方式历史上的每一个时刻都能够被单独拿出来,而未来的每一个时刻也能被单独计划。更重要的是,每一个单独的时刻又能跟相邻的被更大单位所控制的相似时刻做比较,比如,今天的晚上12点跟明天的晚上12点,相似的是,两个时刻都是12点,不同的是今天跟明天,她们是相邻的更大单位。因为这样的缘故,在被更大单位所隔开的每一个相同时刻,我们可以告诉计算机重复某个任务。

在linux下,如果想要在未来的某个时刻执行某个任务,并且在未来的每一个这样的时刻里都要执行这个任务,举个简单的例子,比如说想要在将来,每天的十二点都重启路由器,大多数发行版都自带一个守护进程(daemon)cron来完成这项工作。

1.cron,crontab以及anacron的关系

cron是大多数linux发行版都自带的守护进程(daemon),用来重复运行某些被设定好了确定的运行时间的任务,这些任务可以是每个月运行、每周运行、每天运行,甚至是每一分钟运行。用cron执行的任务适合于24小时运行的机器,cron执行的任务会在设定好的时刻执行,当机器处于关机状态下并错过了任务执行的时间,cron任务就无法预期执行了。

crontab(cron table的简称)既可以指cron用来定期执行特定任务所需要的列表文件,又可以指用来创建、删除、查看当前用户(或者指定用户)的crontab文件的命令。

anacron不是守护进程,可以看做是cron守护进程的某种补充程序,anacron是独立的linux程序,被cron守护进程或者其他开机脚本启动运行,可以每天、每周、每个月周期性地执行一项任务(最小单位为天)。适合于可能经常会关机的机器,当机器重新开机anacron程序启动之后,anacron会检查anacron任务是否在合适的周期执行了,如果未执行则在anacron设定好的延迟时间之后只执行一次任务,而不管任务错过了几次周期。举个例子,比如你设定了一个每周备份文件的任务,但是你的电脑因为你外出度假而处于关机状态四周,当你回到家中开机后,anacron会在延迟一定时间之后只备份一次文件。由于发行版的不同,cron守护进程如何运行anacron会有所不同。

2.crontab命令,crontab文件语法

系统默认crontab文件为/etc/crontab,以及/etc/cron.d/目录下的文件,有些程序会把自己的crontab文件放在/etc/cron.d/目录下。要修改/etc/crontab以及/etc/cron.d/目录下的文件需要root权限。cron守护进程会检查/etc/crontab以及/etc/cron.d/目录下的文件,根据这些文件中的cron任务所设置的执行时间决定是否执行任务,如果当前时间与cron任务所设置的执行时间相同,则执行任务。

每个用户自己的crontab文件都会被放在 /var/spool/cron目录下,默认为空,可以使用crontab命令创建。cron守护进程会检查/var/spool/cron目录下的文件,根据这些文件中的cron任务所设置的执行时间决定是否执行任务,如果当前时间与cron任务所设置的执行时间相同,则执行任务。

当cron的配置文件发生改变时,不需要重置cron守护进程。cron守护进程会检查配置文件的变化。

创建自己的crontab之前,首先要设置环境变量EDITOR,cron进程根据它来确定使用哪个编辑器编辑crontab文件。在home目录下的.bashrc或者.profile里加入一行

#你也可以使用自己喜爱的其他终端编辑器
EDITOR=vim; export EDITOR

2.1.crontab命令参数及使用示例

usage: crontab [-u user] file
 crontab [ -u user ] [ -i ] { -e | -l | -r }
 -e (edit user's crontab)
 -l (list user's crontab)
 -r (delete user's crontab)
 -i (prompt before deleting user's crontab)

创建并编辑当前用户的crontab

crontab -e

列出当前用户的crontab

crontab -l

删除用户linus的crontab

crontab -u linus -i -r

2.2.crontab文件语法详解及示例

当用 crontab -e 编辑当前用户的crontab文件时,首先写入以下内容。

# crontab -e
SHELL=/bin/bash
MAILTO=root@example.com
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

# 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

该文件的前三行代码设置了默认环境。cron守护进程并不提供任何环境。SHELL变量设置当cron任务(命令以及脚本)运行时的shell,MAILTO变量设置cron任务执行结果发送的邮箱,PATH设置去哪些目录下寻找cron任务的命令。注释部分则解释一条cron任务的构成,一条cron任务就是一行,要设置多少条cron任务则写多少行。一条cron任务由七个部分组成,从左到右依次为:

  • 分钟(0-59)
  • 小时(0-23)
  • 天(1-31)
  • 月 (1-12):或者可以使用月份的英文单词的前三个字母,比如jan,apr...
  • 星期(0-6):星期天用0或者7都可以,或者可以使用星期的英文单词的前三个字母,比如sun,sat
  • 用户名称(可以省略)
  • 要执行的命令或者脚本目录

前五个部分的编写注意特殊符号的含义:

  • 如果你想匹配取值范围内的所有值,使用“*”
  • 想匹配某些特殊的值,使用“,”,比如2,4,7就匹配的是2,4以及7。
  • 两个值被“-”连接表示范围,此时匹配的是范围内所有值,包含“-”两边的值,比如4-7匹配的就是从4到7。
  • 想要表达每隔一段时间执行一次任务,使用 “/”, 比如分钟部分中的 “*/10”表示每10分钟运行一次,比如小时部分中的“10-22/2”则表示在早上10点到晚上10点这段时间内,每隔两个小时运行一次。 注意 :当“/”左边的值可以除尽“/”右边的值时,任务才会运行。

例子1:

每天凌晨执行

0 0 * * * root command

例子2:

每周星期天早上五点执行

0 5 * * sun root command

例子3:

每个月的前10天晚上10点开始每隔10分钟执行一次命令

*/10 22 1-10 * * root command

例子4:

从星期一到五,每个小时的第10分钟、第20分钟以及第30分钟都执行一次命令

10,20,30 * * * 1-5 root command

例子5:

从早上10点到晚上10点,每个偶数的小时(比如10点,12点)里每五分钟运行一次命令

*/5 10-22/2 * * * root command

特殊简便写法:

@hourly 代表 0 * * * * ,每个小时运行一次

@daily 代表 0 0 * * * ,每天凌晨运行一次

@weekly 代表 0 0 * * 0 ,每周星期天凌晨运行一次

@monthly 代表 0 0 1 * * ,每个月第一天凌晨运行一次

@yearly 代表 0 0 1 1 * ,每年的头一分钟运行一次

@reboot 重启后执行一次

例子:

每天凌晨运行一次

@daily command

你可以把需要每个小时运行一次的脚本放到/etc/cron.hourly目录下,cron守护进程会每个小时都运行一次。

2.3.限制可以使用cron的用户

在/etc/目录下,可能默认会有cron.allow以及cron.deny文件,也可能没有,没有的情况下可以自己创建,cron.allow文件包含了可以使用cron的用户名,cron.deny文件包含了不可以使用cron的用户名。两个文件中每个用户名占一行,并且不允许出现空格。

root用户在任何情况下都可以使用cron。

假如cron.allow存在,则只有列在这个文件中的用户名可以使用cron,这时候cron.deny被忽视。

假如cron.allow不存在,则列在cron.deny文件中的用户名不可以使用cron。

3.用anacron执行周期性的任务

anacron程序可以周期性的执行任务,但具体执行时间并不确定。可以每天、每周、每个月周期性的执行任务。当anacron的配置文件发生改变时,下一次anacron运行时会检查到配置文件的变化。anacron的配置文件为/etc/anacrontab,编辑需要root权限,默认以下内容:

# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22
#period in days delay in minutes job-identifier command
1  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

可以看到前三行设置了默认环境,RANDOM_DELAY变量设置了最大延迟执行时间,START_HOURS_RANGE变量设置了anacron任务执行的时间范围,默认在每天的3点到22点之间。最后三行则设置了三条默认的anacron任务,分别是每天执行,每周执行,每月执行。

3.1.anacron文件语法

观察前面三条默认的anacron任务,可以看到一条anacron任务分为四个部分,从左到右依次为:

  • 周期(天):设置任务执行的频率,以 天数 为单位,写1则代表每天执行,写3则代表每3天执行,可以使用特殊符号“@”, @daily 代表每天, @weekly 代表每周, @monthly 代表每月。
  • 延迟时间:设置任务的延迟时间,以 分钟 为单位,比如写5,则当anacron启动后,anacron等待5分钟就会执行该任务。设置延迟时间是为了当机器启动时不会因为执行很多anacron任务而过载。
  • 任务标识:其目的是识别消息,日志文件和执行特殊操作。
  • 要执行的命令

在/etc/anacrontab中的三条默认anacron任务中,nice命令用来调整后面命令的优先级,run-parts命令用来执行设置的目录下的所有脚本,就是说这三条任务分别每天,每周,每月执行/etc/cron.daily,/etc/cron.weekly,/etc/cron.monthly目录下的脚本。所以我们不用自己往/etc/anacrontab中添加anacrontab任务,而只需把脚本放到相应的目录下,anacron就会周期性的执行这些脚本了。

3.2.anacron如何运行

既然anacron不是守护进程,那它是如何做到周期性执行任务的呢?在centos7下,cron会运行/etc/cron.d/0hourly,在/etc/cron.d/0hourly文件里,有一条cron任务是这样的:

01 * * * * root run-parts /etc/cron.hourly

这条cron任务会运行/etc/cron.hourly目录下的所有脚本,其中有一个名为 0anacron 的脚本,该脚本则会在合适的时间运行anacron,anacron则会检查/etc/anacrontab,在合适的时间分别运行/etc/cron.daily,/etc/cron.weekly,/etc/cron.monthly目录下的脚本。

参考资料:

How to Schedule Job on Linux using Cron,Anacron and at Commands

How to use cron in Linux

总结

以上所述是小编给大家介绍的在linux上定期执行命令、脚本(cron,crontab,anacron),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程小技巧网站的支持!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


随着云计算和网络技术的发展,越来越多的数据需要在服务器之间进行传输和共享。云挂机宝作为一种常见的服务器设备,具有高效、稳定的特性,使得它成为了许多企业和个人用户传输数据的首选。本文将讨论云挂机宝服务器
阿里云服务器Tomcat无法从外部访问一、环境阿里云Ubuntu 12.04.5 LTStomcat和java都是阿里云默认的7的版本,如下图二、问题部署后./startup.sh启动tomcat 之后外部访问http://ip:8080/无法访问,之后去查看防火墙关闭了Ubuntu下面的防火墙123
购买一系列的东西其实就是花钱买块区域,服务器,域名,云解析,花了好多money。。。一、租服务器百度搜索阿里云进入官网首页,点击登录进入登录页面,可以使用邮箱登录或者注册进入注册页面,填写注册信息登录成功,进入主页,点击云服务ECS,点击购买推荐或者选购配置根据实际情况选择产品,可能没有货,那么就需要更改购买条件如果是新用户,购买
前言昨天买了域名,服务器,然后搭建了环境,然后想他通过默认的端口,不用端口就访问。设置WEB项目的欢迎页在WEB-INF文件夹下有个web.xml文件(最近新建的项目不包含此文件,可以手动新建),在welcome-file-list节点中设置,代码如下 <welcome-file-list> <welcome-file>test.html</welcome-file>
前言由于服务器centos6.8安装mysql一直出现不能连接问题,然后看到一个方法,一不小心就把yum给删除了,都还原不了,很是绝望,很难受。然后没有yum这个centos就感觉废了,然后找方法装上去。 python --version查看python 版本 whereis python 查看python文件 python: /usr/bin/python2.6 /usr/bin/python
前言用 SSH客户端登录上以后,自己想要在本地连接服务器上的mysql服务器。解决方法1、首先启动数据库[root@iZm5ec880z2rorZ ~]# service mysqld start可以输入一下加粗命令:[root@iZm5ec880z2rorZ ~]# mysql -u root -p Enter password: (输入你的数据库密码)Welcome to the My
前言乱码问题是很让人抓狂的问题,下面我将记录一下Linux下MySQL乱码问题的解决方法。 mysql在linux下乱码问题一、操作mysql默认字符集是latin1,但是我们大部分程序使用的字符集是utf8,我们就需要修改mysql的字符集了。1)查看默认编码show variables like 'character%';+--------------------------+--------
问题描述今天阿里云服务器安装mysql的收,遇到了一个很熟悉的问题 输入#mysql -u root -p ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) 解决方案一、方案1 1.#ps -A|grep mysql 显示类似:
今天在使用filezilla连接虚拟机中的ubuntu的时候出现上次出错,错误详情为:open for write: permission denied看完错误大概知道和权限有问题,再次查看虚拟机,我们使用以下命令给我们需要放入的目标文件权限:sudo chmod 777 /home再次尝试上传,上传成功! ...
直接上步骤,做一个简单的记录!配置阿里云oss找到对应的oss如果没有bucket,则新建一个新建之后,进入到对应的bucket,然后进行相关设置以上就是oss的基本设置,接下来是域名相关设置,这也是最重要的一些步骤。oss域名解析和cdn设置oss域名解析设置oss的域名设置是在传输管理下进行设置。如果没有域名,需要添加域名,没有注册域名自行注册。添加之后就会在上面列表上显示。以上就是域名的解析配置,期间还需要设置域名解析cname等。oss的cdn设置加速设置cdn
这个需要开放centos的端口和腾讯云服务器的端口。防火墙开放8080端口因为Centos7以上用firewalld代替了iptables,也就是说firewalld开通了8080端口应该就行了1.输入netstat -tunlp 查看8080是否放开。2.如果没有开放,输入firewall-cmd --state #查看防火墙状态。3.在running 状态下,向firewall 添加需要开放的端口firewall-cmd --permanent --zone=public --add-po
前言:博主资历尚浅,很多东西都还在刚起步学习的阶段,这几天开发任务比较轻,就在自己window系统下,模拟部署远程服务器,利用Jenkins + Ant + Tomcat 搭建了一个自动发布部署的环境
为了做集群测试,在每台机器上装了3个tomcat,每次发布项目的时候都要反复敲一些命令,重启 tomcat 之前先检查 tomcat 进程有没有停掉,没有还要手动 kill 该进程。 发布次数多了,操
Jenkins修改管理员密码,我看了网上所有的教程,竟然全都是拿着一串已经加密好的 111111 的密文去替代 config.xml 文件里面的密码,然后大家的密码都是 111111!我觉得这种做法实
一、四层与七层负载均衡在原理上的区别 1.图示 2.概述 四层负载均衡工作在 OSI 模型中的四层,即传输层。四层负载均衡只能根据报文中目标地址和源地址对请求进行转发,而无法修改或判断所请求资源的具体
和 window不同,在Linux压缩文件需要注意的是,压缩后的文件会把源文件给替代,无论是gzip、bzip2、xz 均不支持压缩目录,要达到压缩目录的目的,需要用到tar指令。 gzip 压缩 g
一、前言 随着每天业务的增长,Tomcat 的catalina.out日志 变得越来越大,占用磁盘空间不说。要查看某个时候的日志的时候,庞大的日志让你顿时无从下手,所以日志的切割的变得刻不容缓。而且,
一、安装 和 准备工作 我们选择了用 Tomcat 服务器下 war 包的安装方式。Jenkins 的下载地址:http://mirrors.jenkins-ci.org/,打开链接后,表格有war列
一、gcc gcc是Linux上面最标准的C语言的编译程序,用来源代码的编译链接。 gcc -c hello.c 编译产生目标文件hello.o gcc -O hello.c 编译产生目标文件,并进行
随着智能化互联时代的来临,家中的智能设备越来越多:电视机、平板、游戏主机、电脑、手机等遍及家中各个角落,同时设备之间共享数据的需求变的越来越强烈。比如同步、备份手机上的照片和视频,在电视机上观看电脑中