写了个shell脚本,是用hive拉取数据之后存在一个文件中,再调用一个python脚本以邮件的附件形式将这个文件发送出去。直接运行的时候完全没有问题,但是我准备每天弄一个任务定时发送邮件,在crontab 中写好了相应的语句,等了一会儿发现没有发送邮件。
纳尼?这是为什么呢?运行的脚本写的也是绝对路径啊。。。
鉴于我觉得这是个非常简单的功能,我一开始是没有写入日志的,后来我将标准错误输出写入到一个日志中,我发现上面写着:
hive:command not found
和
no module named argparse found。
= =
上网百度了一下,发现是crontab的环境变量和自己运行时的环境变量不同导致,而python中no module named argparse found大概是因为crontab中使用的python版本不支持argparse模块。
crontab环境变量的获取:在 crontab中加入一条printenv >xx/xx/xx/env.txt(都要使用绝对路径)
在shell脚本中加入
1)source /etc/profile #嗯,一开始我没加
2)然后用locate /bin/hive找出对应一个hive的位置,当然由于向下兼容,当然找的是最新版本的hive的位置,将原本的hive命令改成绝对路径
3)最后在调用python时,我打完python按了两下tab键,所有的python版本号就出现了,机子上最高的版本是python2.7,就用locate找出对应的python位置,
用/usr/local/bin/python2.7替代原本的python。
简而言之,就是所有能用到绝对路径的地方都使用绝对路径,然后用的版本尽可能地高,毕竟一般都是向下兼容吗。
做个纪念= =
2016.9.1日
运行一个程序出现了 /bin/sh: hive: command not found
这个是在一个python脚本中调用hive出错,查了一天,顺手把脚本都优化了,还是没有查出来为什么。
我一直以为是由于一开始调用的hive出错,但是后来才发现是python脚本内调用的hive除了问题。搜索/bin/sh: hive: command not found 没找到相关结果,
搜索python/bin/sh: hive: command not found 就发现了这篇文章,唉,对,我之前写的。
其实这个问题也是由于crontab引起的,但是由于我直接在crontab内调用了python脚本导致的,直接调用的时候,找不到hadoop_home,写成绝对路径也没用。
于是最后写了了shell脚本,在shell内调用python,同时在脚本内加入
. /etc/profile
即可
简而言之,就是能用sh的地方尽量用sh ,很少出问题, = =
再做个纪念= =