Cron

工具型软件cron是一款类Unix的操作系统下的基于时间的任务管理系统。用户们可以通过cron在固定时间、日期、间隔下，运行定期任务（可以是命令和脚本）。cron常用于运维和管理，但也可用于其他地方，如：定期下载文件和邮件。cron该词来源于希腊语chronos（χρόνος），原意是时间。 通常，任务时间表（crontab）文件储存的指令被crond守护进程啟動，守护进程在后台运行，并每一分钟检查是否有定期的作业需要执行。这类作业一般称为cron jobs。 举例 ┌───────────── minute (0–59) │ ┌───────────── hour (0–23) │ │ ┌───────────── day of the month (1–31) │ │ │ ┌───────────── month (1–12) │ │ │ │ ┌───────────── day of the week (0–6) (Sunday to Saturday; │ │ │ │ │ 7 is also Sunday on some systems) │ │ │ │ │ │ │ │ │ │ * * * * * <command to execute> crond是一个用于执行周期命令的守护进程。通过守护进程（/lib/systemd/system/crond.service ）形式运行的cron程序称为crond。 cron会通过以下路径查找crontabs： /etc/crontab：为系统任务时间表（crontab）。以前用于跑以日为单位、以周为单位、以月为单位的任务，现在用于跑anacron。 /etc/cron.d/：该目录包含系统层次的任务时间表（crontabs），不同用户共同使用。 /var/spool/cron/：该路径包含用户通过crontab 命令创建的任务时间表（crontables）。 crontab 命令用于维护每个用户的任务时间表（crontab）文件。 crontab 命令用于安装任务时间表（crontab）文件，删除和列举 crond守护进程已经在使用的任务时间表（crontab）。每个用户都会拥有自己独自的任务时间表（crontab），这些文件会存放在/var/spool/目录下，不建议用户直接修改这些文件。MLS模式下的SELinux，你可以为这些任务时间表（crontab）分等级。 crontab文件包含crond守护进程所需的一系列作业和指令。 crontab文件的每一行均遵守特定的格式，由空格或tab分隔为数个领域，每个领域可以放置单一或多个数值。 /var/spool/cron/下的任务时间表（crontab）文件是用户层次的，格式如下： # 文件格式說明 # ┌──分鐘（0 - 59） # │ ┌──小時（0 - 23） # │ │ ┌──日（1 - 31） # │ │ │ ┌─月（1 - 12） # │ │ │ │ ┌─星期（0 - 6，表示从周日到周六） # │ │ │ │ │ # * * * * * 被執行的命令 注： 在某些系统里，星期日也可以为7 不很直觀的用法：如果日期和星期同時被設定，那麼其中的一個條件被滿足時，指令便會被執行。請参考下例。 前5個域稱之分時日月周，可方便個人記憶。 從第六個域起，指明要執行的命令。 /etc/crontab和/etc/cron.d/目录下的任务时间表（crontabs）文件是系统层次的，格式如下： # 文件格式說明 # ┌──分鐘（0 - 59） # │ ┌──小時（0 - 23） # │ │ ┌──日（1 - 31） # │ │ │ ┌─月（1 - 12） # │ │ │ │ ┌─星期（0 - 6，表示从周日到周六） # │ │ │ │ │ # * * * * * 用户名 被執行的命令 系统层次的任务时间表（crontabs）的任务经常会指定一个或以上的用户进行执行，因此任务时间表（crontabs）文件需要增加“用户名”字段。 在一个区域里填写多个数值的方法： 逗号（,）表示列举，例如： 1,3,4,7 * * * * echo hello world 表示，在每小时的1、3、4、7分时，打印"hello world"。 连词符（-）表示范围，例如：1-6 * * * * echo hello world ，表示，每小时的1到6分钟内，每分钟都会打印"hello world"。 星号（*）代表任何可能的值。例如：在“小时域”里的星号等于是“每一个小时”。 百分号(%) 表示“每"。例如：*%10 * * * * echo hello world 表示，每10分钟打印一回"hello world"。 某些cron程序的扩展版本（如：Quartz Java scheduler）也支持斜线（'/'）操作符，用于表示跳过某些给定的数。例如，“*/3”在小时域中等于“0,3,6,9,12,15,18,21”等被3整除的数； #================================================================= # SYSTEM ACTIVITY REPORTS # 8am-5pm activity reports every 20 mins during weekdays. # activity reports every hour on Saturday and Sunday. # 6pm-7am activity reports every hour during weekdays. # summary prepared at 18:05 every weekday. #================================================================= 0,20,40 8-17 * * 1-5 /usr/lib/sa/sa1 1200 3 & 0 * * * 0,6 /usr/lib/sa/sa1 & 0 18-7 * * 1-5 /usr/lib/sa/sa1 & 5 18 * * 1-5 /usr/lib/sa/sa2 -s 8:00 -e 18:01 -i 3600 -ubcwyaqvm & 一個常見的錯誤是，命令行雙引號中使用%時，未加反斜線\，例如： # 錯誤的例子： 1 2 3 4 5 touch ~/error_`date "+%Y%m%d"`.txt 在守护进程发出的電子郵件中會見到錯誤訊息： /bin/sh: unexpected EOF while looking for `''''''' # 正確的例子： 1 2 3 4 5 touch ~/right_$(date +\%Y\%m\%d).txt # 使用單引號也可以解决問題： 1 2 3 4 5 touch ~/error_$(date '+%Y%m%d').txt # 使用單引號就不用加反斜線了。這個例子會產生這樣一個文件~/error_\2006\04\03.txt 1 2 3 4 5 touch ~/error_$(date '+\%Y\%m\%d').txt 下例是另一個常見錯誤： # Prepare for the daylight savings time shift 59 1 1-7 4 0 /root/shift_my_times.sh 初看似要在四月的第一個星期日早晨1時59分運行shift_my_times.sh，但是這樣設置不對。 特殊地，當星期域（第五個域）被指定為 * 時，星期域與日域（第三個域）執行“與”操作；而當星期域（第五個域）被指定為 * 以外的内容時，星期域與日域執行“或”操作。 所以這個程序會在4月1日至7日以及4月余下的每一個星期日執行。 另一個常見錯誤是對分鐘設置的誤用。下例欲一個程序兩個小時運行一次： # adds date to a log file * 0,2,4,6,8,10,12,14,16,18,20,22 * * * date >> /var/log/date.log 而上述設置會使該程序在偶數小時内的每一分鐘執行一次。正確的設置是： # runs the date command every even hour at the top of the hour 0 0,2,4,6,8,10,12,14,16,18,20,22 * * * date >> /var/log/date.log # an even better way 0 */2 * * * date >> /var/log/date.log 如果输出结果来自crontab里的命令，那么cron守护进程会用电子邮件将它发给用户。 若想关闭某个命令的输出结果，可以将输出结果重定向至/dev/null。 >/dev/null 2>&1 在常用的Vixie cron中，也可以在文件的开始部分加入命令来关闭所有命令的邮件输出： MAILTO="" /etc/init.d/cron reload #Reloading configuration files for periodic command scheduler: cron. /etc/init.d/cron stop #Stopping cron (via systemctl): cron.service. /etc/init.d/cron start #Starting cron (via systemctl): cron.service. /etc/init.d/cron restart #Restarting cron (via systemctl): cron.service. /etc/init.d/cron status At：在未来某个时间运行一个作业。 Anacron（英语：Anacron）：runs job on a periodic interval, anachronistically. Launchd（英语：Launchd）：Mac OS X／Darwin cron替代版本。 Unix程序列表 daemon to execute scheduled commands. （原始内容存档于2019-12-18）.  DESCRIPTION of cron. （原始内容存档于2019-12-18）.  Cron checks these files and directories:. （原始内容存档于2019-12-18）.  /etc/cron.d/ a directory for storing system crontabs.. （原始内容存档于2019-12-08）.  crontab命令的名字章节. （原始内容存档于2020-02-03）.  crontab命令的描述. （原始内容存档于2020-02-03）.  A crontab file contains instructions for the cron(8) daemon. （原始内容存档于2019-12-08）.  Jobs in /etc/cron.d/. （原始内容存档于2019-12-08）.  Crontab : Scheduling Tasks（页面存档备份，存于互联网档案馆） Computer Hope（页面存档备份，存于互联网档案馆） Linux / UNIX中crontab的用法 Opengroup's crontab specification（页面存档备份，存于互联网档案馆） - UNIX 03正式文档 Crontab - Reference and Examples at mkaz.com（页面存档备份，存于互联网档案馆） Cron for Windows CVSweb for FreeBSD's cron - Paul Vixie的1993 Vixie cron 3.0版本修补了一些错误 fcron（页面存档备份，存于互联网档案馆） - vixiecron / anacron的增强版本（GPL）