一、错误现象
之前放在服务器上的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 shell
或ssh
中有差异,所以还会有些命令在普通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