前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >直接执行成功,crontab却执行失败

直接执行成功,crontab却执行失败

作者头像
后端技术探索
发布2019-03-04 15:36:06
4.2K0
发布2019-03-04 15:36:06
举报
文章被收录于专栏:后端技术探索后端技术探索

背景

程序员在日常工作中,为了解放人力提高效率,常常需要把一些周期性的任务例行化执行,比如每天发送一封数据报表邮件,每小时备份一次日志文件等。常用的技术方案是写一个shell脚本,然后通过配置linux的crontab来定时执行脚本(关于crontab,太过于基础,本文不做讲解)。

老大年前给要一份报表数据,我拼拼凑凑跑出来发给老大,大年初4在吃吃喝喝享受生活的时候老大又要近几天的数据……,沟通后,和老大达成一致,每周汇总一次近一周的数据。

问题

写了一个汇总数据并且发送邮件的shell脚本(/tmp/email.sh),手工执行是成功的,但是通过crontab执行却总是失败。

shell脚本如下:

代码语言:javascript
复制
#!/bin/bash
function getDay() {
    # 数据统计核心逻辑
    echo "$DATE" "$data1" "$data2" "$data3" >> /tmp/lastweek.txt
}

rm /tmp/lastweek.txt
echo "日期  第一列    第二列  第三列" >> /tmp/lastweek.txt
for (( i = 7; i > 0 ; i--));do
    DATE="`date -d "$i days ago" '+%Y%m%d'`"
    getDay $DATE
done

#发送邮件
START_DATE="`date -d "7 days ago" '+%Y%m%d'`"
END_DATE="`date -d "yesterday" '+%Y%m%d'`"
mail -s "数据统计报表["$START_DATE"~"$END_DATE"]" hello@163.com < /tmp/lastweek.txt

手工执行正确邮件如下:

crontab执行发送失败的邮件如下:

分析

crontab执行发送的错误邮件,标题中文部分为乱码,怀疑是环境变量LANG不支持中文,于是来简单测试一下:

代码语言:javascript
复制
#!/bin/bash
echo $LANG >> /tmp/test_out

crontab定时执行输出结果为:

代码语言:javascript
复制
[空]

直接执行输出结果为:

代码语言:javascript
复制
en_US.UTF-8

解决

方案就很明确了,强制设置环境变量LANG的值即可,在原有shell脚本(/tmp/email.sh)中添加如下语句:

代码语言:javascript
复制
export LANG="zh_CN.UTF-8"

再次使用crontab执行,邮件正常发送。

知识点

不要假定crontab知道所需要的特殊环境变量,它其实并不知道。所以你要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。所以注意如下3点:

1)脚本中涉及文件路径时写全局路径; 2)脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:

代码语言:javascript
复制
cat start_cbp.sh
#!/bin/sh
source /etc/profile
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh -c mev &

3)当手动执行脚本OK,但是crontab死活不执行时。这时必须大胆怀疑是环境变量惹的祸,除了在shell脚本中通过source或者export命令引入变量,也可以尝试在crontab中直接引入环境变量解决问题。如:

代码语言:javascript
复制
0 * * * * . /etc/profile;/bin/sh /tmp/email.sh
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-02-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 nginx 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云 BI
腾讯云 BI(Business Intelligence,BI)提供从数据源接入、数据建模到数据可视化分析全流程的BI能力,帮助经营者快速获取决策数据依据。系统采用敏捷自助式设计,使用者仅需通过简单拖拽即可完成原本复杂的报表开发过程,并支持报表的分享、推送等企业协作场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档