一、错误现象

之前放在服务器上的cron脚本总是没有达到想要的效果,去日志中检查却发现脚本确实有在被正常执行。

2021-08-09T00:05:01.226538+08:00 admin CRON[406171]: (tianliang) CMD (aliddns.sh -m --record home --value $(curl -s icanhazip.com))

二、原因排除

在折腾好cron的执行过程的邮件发送之后,总算定位到了原因。

[34m[Info] [0m[AliDNSModify] 修改DNS解析记录
[33m[Error] [0m[AliDNSModify]Domain信息未设置!

Emmmm。。。。环境变量没法识别到?
找了一圈才知道,cron在执行的时候环境变量并不会被加载。如果脚本中有用到环境变量的话需要自己手动加载才行.....
如,在脚本中加载环境变量:

#!/bin/bash
. /etc/profile
. ~/bashrc
......

crontab执行命令前加载:

* * * * * source /etc/profile & aliyunddns.sh

三、折腾

因为cron命令时的执行环境与咱们在bash shellssh中有差异,所以还会有些命令在普通shell中可以执行,但是在crontab中无法执行。
我们可以通过如下crontab命令来确认crontab的执行环境:

* * * * * printenv > /tmp/cron_env.txt

同时我们也可以在crontab中设置一些环境执行环境,如:

# Envirment setting
SHELL=/bin/bash
HOME=/home/tianliang
PATH="/home/tianliang/bin:/usr/local/bin:/usr/bin:/bin:/home/tianliang/bin"
# MAILFROM=admin@lintian.co
# MAILTO=xxx@lintian.co
# CONTENT_TYPE="text/plain, charset=utf-8"
#----------------------------------------------------------------------------------------
#Minute Hour    Day     Month   Weekday Command
*/2     *       *       *       *       ls -a -l ~/ | mail -Es "ls -a -l ~/" xxx@lintian.co