在Linux或UNIX中如何添加计划任务
在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