在Linux或UNIX中如何添加计划任务

时间:2019-11-20 08:53:32  来源:igfitidea点击:

在Linux或UNIX等操作系统中,如何定期执行脚本?
如何在Linux中添加计划任务?
Linux crontab命令

Linux计划任务

Cron是Linux或UNIX中有用的工具,通常用于运维任务作业,比如定时备份,执行脚本等。

cron服务(守护程序)在后台运行,
不断检查/etc/cron.*/目录,/var/spool/cron /目录和/etc/crontab文件。
从而执行定时任务。

使用crontab命令,可以修改自己crontab文件内容,从而添加,删除计划任务。

cron配置文件的类型

crontab有不同类型的配置文件:

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

  • 用户的crontab:用户可以使用crontab命令安装自己的cron作业。第六个字段是要运行的命令,所有命令都以创建crontab的用户身份运行

如何创建自己的cron计划任务

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

$ crontab -e

修改crontable文件后是否必须重启cron进程?

不需要。
Cron后台进程将检查所有crontab的修改时间,并重新加载被修改的crontab。
因此,在修改crontab文件后,无需重启cron守护进程。

crontab的语法

语法为:

* * * * * 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)
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 )
  • 5:星期几(0-7 0或7表示星期天)
  • /path/to/command计划的脚本或命令

如果是系统级的crontab计划任务:

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

或者

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

crontab 示例

凌晨3点运行/root/backup.sh备份脚本:

运行以下命令安装cronjob:

# crontab -e

添加下面行:

0 3 * * * /root/backup.sh

保存并关闭文件即可。

每天00:05分运行/path/to/command:

5 0 * * * /path/to/command

每月1号14:15运行/path/to/script.sh:

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

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

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

每2小时运行一次/root/scripts/perl/perlscript.pl:

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

星期天凌晨4点零5分运行/path/to/unixcommand:

5 4 * * sun /path/to/unixcommand

如何在crontab中使用运算符?

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

有4个运算符:

  • 星号(*):此运算符指定字段可以是任意可能值。例如,小时时间字段中的星号表示每个小时
  • 逗号(,):此运算符指定值列表,例如:1、5、10、15、20、25。
  • 破折号(-):此运算符指定一个值范围,例如:5-15 表示5到15。
  • 分隔符(/):此运算符指定一个步进值,例如:小时字段中的0-23/1每隔一小时执行一次命令。星号后也可以是步长值,例如*/2表示每2小时执行一次。

如何禁止crontab发送电子邮件?

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

如果不想接收来自crontab的电子邮件,您需要在命令后面添加>/dev/null 2>&1。

例如:

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

要将输出发送到特定的电子邮件帐户,需要定义MAILTO变量,如下所示:

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

如何查看crontab所有的计划任务?

# crontab -l
# crontab -u username -l

如何删除所有的crontab计划任务?

# 删除当前用户的计划任务
crontab -r

## 删除某个用户的计划任务
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 是系统级别的配置文件。
通常系统级的作业任务由root用户或者守护程序来配置。

普通用户必须使用crontab命令进行配置。
普通用户的crontab文件保存在/var/spool/cron或者/var/cron/tabs中。

默认的/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/每周运行一次所有脚本

如何备份crontab计划任务

执行下面的命令,可以将计划任务备份到/home/Hyman/backup中:

# crontab -l > /home/Hyman/backup/cron/users.root.bakup
# crontab -u userName -l > /home/Hyman/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