Linux Cron 定时任务

crontab 命令分析

先贴出一个正确的 crontab 配置, 下面慢慢解释.

3 */6 * * * /bin/bash /opt/model/ut-nlp-python/start.sh >/dev/null 2>&1

crontab 表达式

3 */6 * * * 表示什么含义呢? 可以在网上任意找个在线计算 crontab 表达式执行时间的工具, 如下图所示, 该表达式表示每过 6 小时零 3 分执行后面的命令, 接下来, 第一次执行是 2019-04-05 凌晨 3 分.

>/dev/null

可以把 /dev/null 可以看作"黑洞". 它等价于一个只写文件, 所有写入它的内容都会永远丢失, 而尝试从它那儿读取内容则什么也读不到.

> 输出重定向, 因此这条语句相当于把输出直接扔掉.

2>&1

对于 &1 更准确的说应该是文件描述符 1, 而 1 标识标准输出 stdout. 对于 2, 表示标准错误 stderr. 2>&1 的意思就是将标准错误重定向到标准输出. 而根据前面这里标准输出已经重定向到了 /dev/null, 那么标准错误也会输出到 /dev/null.

如何写出正确的 crontab 命令

49 17 * * * /bin/bash /opt/model/ut-nlp-python/start.sh >/tmp/nlp.log 2>&1

查看处理日志

$ tail -f /var/log/cron
Apr  4 17:49:01 ut-nlp03 CROND[7888]: (rec) CMD (/bin/bash /opt/model/ut-nlp-python/start.sh >/tmp/nlp.log 2>&1)

查看报错日志

$ tail -f /tmp/nlp.log
nohup: failed to run commandpython3’: No such file or directory

查看 python3 命令的路径

$ which python3
/usr/local/bin/python3

start.sh 脚本中增加如下命令

export PATH=/usr/local/bin:$PATH

再次测试, 报如下错误

$ tail -f /tmp/nlp.log
python3: can't open file 'main.py': [Errno 2] No such file or directory

start.sh 脚本中增加如下命令

cd `dirname $0`

总结

  1. 测试时, 将标准错误重定向到日志文件, 便于定位问题.
  2. 尽量在脚本中增加 PATH 变量和当前脚本路径.