crontab 是 Linux 的一个执行定时任务的程序。

当前用户配置 crontab 配置情况:

crontab -l

编辑用户配置文件:

crontab -e

以上命令是将设置写入用户级配置文件,以下方法可以直接修改系统级配置。

system wide 配置文件地址:/etc/crontab

配置文件文件格式:

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

30  1  *  *  * root bash /root/backup.sh

前几个设置是 corn 执行环境设置,尤其是 PATHHOME 需要正确设置才能保证部分命令正确执行。

# 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
30  1  *  *  * root bash /root/backup.sh

以上指令代表每天 1:30 执行脚本。每个字段的写法可以有多种类型:单一数字 数字段 数字组 数字间隔

单一数字,指定时间点运行:

30  1  *  *  * root bash /root/backup.sh

数字段,指定时间段运行:

30  1-6  *  *  * root bash /root/backup.sh

数字组,指定多个时间点运行:

30  1,3,5  *  *  * root bash /root/backup.sh

数字间隔,指定每隔多少时间执行:

*/30  *  *  *  * root bash /root/backup.sh
0  */3  *  *  * root bash /root/backup.sh

加载环境变量:
默认情况下,crontab 里的定时任务不能调用 .bashrc 或者在其他自定义 env 文件中定义的环境变量,导致脚本手动执行的时候没问题,自动定时运行就会出错。

解决方法就是在 crontab 文件中定义环境变量,或者指定加载某个环境变量文件即可。

方法一:在定时任务中直接定义环境变量

* * * * * LEARNING_FROM=baeldung LANG=es_US /etc/test.sh

方法二:通过 bash -l -c 以 login shell 方式运行脚本,这样会运行时自动加载 /etc/profile, ~/.bash_pofile, ~/.bash_login, ~/.profile 这几个配置文件

* * * * * bash -l -c /etc/test.sh

注意以上方法依然没有加载 ~/.bashrc 文件,如果需要加载这个文件则需要通过 BASH_ENV 加载:

* * * * * BASH_ENV=~/.bashrc bash -l -c /etc/test.sh

以上指令就相当于加载了所有的系统级初始化配置文件了。

方法三:通过 BASH_ENV 加载自定义环境变量文件

* * * * * BASH_ENV=/etc/env_addon bash /etc/test.sh

env_addon 中是一些自定义的环境变量,如:

ENV1=abcd
ENV2=5678

参考链接:
How to Load Environment Variables in a Cron Job