如何在Linux或UNIX下将计划任务添加到cron

时间:2020-01-09 14:16:38  来源:igfitidea点击:

如何在Linux或UNIX等操作系统下添加cron作业?

Cron允许Linux和Unix用户在给定的日期和时间运行命令或脚本。
您可以安排脚本定期执行。

Cron是Linux或UNIX之类的操作系统中最有用的工具之一。
它通常用于sysadmin作业,例如备份或清理/tmp /目录等。

cron服务(守护程序)在后台运行,并不断检查/etc/crontab文件和/etc/cron.* /目录。
它还检查/var/spool/cron /目录。

用于cron作业的crontab命令

每个用户都可以拥有自己的crontab文件,尽管这些文件是/var/spool/cron/crontabs中的文件,但并不打算直接对其进行编辑。
解决方法:您需要使用crontab命令来编辑或设置自己的cron作业。

cron配置文件的类型

有不同类型的配置文件:

  • UNIX/Linux系统crontab:通常由系统服务和需要root特权的关键作业使用。第六个字段(请参阅下面的字段说明)是命令运行的用户名。这使系统crontab能够以任何用户身份运行命令。
  • 用户crontabs:用户可以使用crontab命令安装自己的cron作业。第六个字段是要运行的命令,所有命令都以创建crontab的用户身份运行

注意:该常见问题以Paul Vixie编写的cron实现为特色,并包含在许多Linux发行版和Unix之类的系统中,例如流行的BSD第4版中。
该语法与crond的各种实现兼容。

如何安装或创建或编辑自己的Cron作业?

要编辑或创建自己的crontab文件,请在UNIX/Linux shell提示符下执行以下命令:

$ crontab -e

更改crontable文件后是否必须重新启动cron?

不需要重启。
Cron将检查所有crontab的修改时间,并重新加载已更改的crontab。
因此,无论何时修改crontab文件,都无需重新启动cron。

crontab的语法(字段描述)

语法为:

1 2 3 4 5 /path/to/command arg1 arg2

或者

1 2 3 4 5 /root/backup.sh

其中:

  • 1:分钟(0-59)
  • 2:小时(0-23)
  • 3:天(0-31)
  • 4:月份(0-12 [12 == 12月])
  • 5:星期几(0-7 [7或0 ==星期日])
  • /path/to/command计划的脚本或命令名称

易于记忆的格式:

* * * * * command to be executed
- - - - 
| | | | |
| | | | ----- Day of week (0 - 7) (Sunday=0 or 7)
| | | ------- Month (1 - 12)
| | --------- Day of month (1 - 31)
| ----------- Hour (0 - 23)
------------- Minute (0 - 59)

您的cron作业对于"系统作业"如下所示:

1 2 3 4 5 USERNAME /path/to/command arg1 arg2

或者

1 2 3 4 5 USERNAME /path/to/script.sh

示例:运行备份cron作业脚本

如果希望每天凌晨3点运行名为/root/backup.sh的脚本,则crontab条目将如下所示。
首先,通过运行以下命令安装cronjob:

# crontab -e

追加以下条目:

0 3 * * * /root/backup.sh

保存并关闭文件。

更多例子

要每天每天午夜五点后运行/path/to/command,请执行:

5 0 * * * /path/to/command

每个月的第一天下午2:15运行/path/to/script.sh,执行:

15 14 1 * * /path/to/script.sh

在工作日的晚上10点运行/scripts/phpscript.php,执行:

0 22 * * 1-5 /scripts/phpscript.php

每天凌晨2点,凌晨4点之后23分钟运行/root/scripts/perl/perlscript.pl,执行:

23 0-23/2 * * * /root/scripts/perl/perlscript.pl

每个星期日4点后的5点运行/path/to/unixcommand,执行:

5 4 * * sun /path/to/unixcommand

如何使用运算符?

运算符允许您在一个字段中指定多个值。
有三个运算符:

  • 星号(*):此运算符指定字段的所有可能值。例如,小时时间字段中的星号等于每个小时,而月份字段中的星号等于每个月。
  • 逗号(,):此运算符指定值列表,例如:1、5、10、15、20、25。
  • 破折号(-):此运算符指定一个值范围,例如:5-15 days,等效于使用来执行5,6,7,8,9,。,13,14,15逗号运算符。
  • 分隔符(/):此运算符指定一个步进值,例如:0-23 /可以在小时字段中用于指定每隔一小时执行一次命令。星号后也可以执行步骤,因此,如果您每两小时要说一次,请使用*/2。

如何禁用电子邮件输出?

默认情况下,命令或脚本(如果产生的话)的输出将是电子邮件到您的本地电子邮件帐户。

要停止接收来自crontab的电子邮件输出,解决方法:您需要追加>/dev/null 2>&1。例如:

0 3 * * * /root/backup.sh >/dev/null 2>&1

要将输出邮件发送到特定的电子邮件帐户,例如[email protected]
解决方法:您需要定义MAILTO变量,如下所示:

MAILTO="[email protected]"
0 3 * * * /root/backup.sh >/dev/null 2>&1

有关更多信息,请参见通过Crontab命令禁用邮件警报。

列出所有cron作业执行以下命令:

# crontab -l
# crontab -u username -l

要删除或擦除所有crontab作业,请使用以下命令:

# Delete the current cron jobs #
crontab -r## Delete job for specific user. Must be run as root user ##
crontab -r -u username

使用特殊字符串可以节省时间可以使用八个特殊字符串中的任何一个来代替前五个字段。它不仅可以节省您的时间,而且可以提高可读性。

特殊字符串含义
@reboot在启动时运行一次。
@yearly每年运行一次,0 0 1 1 *
@annually(与@yearly相同)
@monthly每月运行一次,0 0 1 * *.
@weekly每周运行一次,0 0 * * 0.
@daily每天运行一次,0 0 * * *.
@midnight(与@daily相同)
@hourly每小时运行一次,0 * * * *.

示例
每小时运行ntpdate命令:

@hourly /path/to/ntpdate

每天进行一次备份:

@daily /path/to/backup/script.sh

有关/etc/crontab文件和/etc/cron.d/*目录的更多说明

/etc/crontab是系统crontabs文件。

通常仅由root用户或守护程序用于配置系统范围的作业。所有个人用户必须如上所述使用crontab命令安装和编辑其作业。/var/spool/cron /或/var/cron/tabs /是个人用户crontab文件的目录。必须使用用户主目录进行备份。

了解默认的/etc/crontab

典型的/etc/crontab文件条目:

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

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

首先,必须定义环境。如果省略了shell行,则cron将使用默认值sh。
如果省略PATH变量,则不会使用默认值,并且文件位置必须是绝对的。
如果省略HOME,则cron将使用调用用户的主目录。

此外,cron还将读取/etc/cron.d/目录中的文件。

通常,系统守护程序(例如sa-update或sysstat)会将其cronjob放在此处。

作为root用户或超级用户,您可以使用以下目录来配置cron作业。您可以在此处直接放置脚本。
run-parts命令通过/etc/crontab文件在目录中运行脚本或程序:

目录说明
/etc/cron.d/将所有脚本放在此处,然后从/etc/crontab文件中调用它们。
/etc/cron.daily/每天运行一次所有脚本
/etc/cron.hourly/每小时运行一次所有脚本
/etc/cron.monthly/每月运行一次所有脚本
/etc/cron.weekly/每周运行一次所有脚本

如何使用以上目录放置自己的脚本或作业?

这是一个名为clean.cache的示例Shell脚本。
创建此脚本的目的是每10天清理一次缓存的文件。
该脚本直接在/etc/cron.daliy/目录中创建。
换句话说,如下创建一个名为/etc/cron.daily/clean.cache的文本文件。

#!/bin/bash
# A sample shell script to clean cached file from lighttpd web server
CROOT="/tmp/cachelighttpd/"
 
# Clean files every $DAYS
DAYS=10
 
# Web server username and group name
LUSER="lighttpd"
LGROUP="lighttpd"
 
# Okay, let us start cleaning as per $DAYS
/usr/bin/find ${CROOT} -type f -mtime +${DAYS} | xargs -r /bin/rm
 
# Failsafe 
# if directory deleted by some other script just get it back 
if [ ! -d $CROOT ]
then 
        /bin/mkdir -p $CROOT
        /bin/chown ${LUSER}:${LGROUP} ${CROOT}
fi

保存并关闭文件。设置权限:

# chmod +x /etc/cron.daily/clean.cache

我如何备份已安装的cron作业条目?
只需执行以下命令即可将cronjobs备份到安装在/nas01/backup/cron/users.root.bakup目录中的nas服务器:

# crontab -l > /nas01/backup/cron/users.root.bakup
# crontab -u userName -l > /nas01/backup/cron/users.userName.bakup

crond和cron作业日志文件

您可以使用cat命令/grep命令/tail命令查看crond日志文件。例如,在CentOS 7 Linux上,可以使用以下命令:

cat /var/log/cron
tail -f /var/log/cron
grep "my-script.sh"
tail -f /var/log/cron

了解每日备份作业是否在FreeBSD Unix服务器上运行:

$ sudo grep '/usr/local/bin/rsnapshot daily' /var/log/cron

在现代的Linux发行版上,可以使用systemctl命令或journalctl命令:

sudo systemctl status cron
sudo journalctl -u cron
sudo journalctl -u cron | grep backup-script.sh