文档章节

crontab 执行环境变量的问题

loveczp
 loveczp
发布于 2013/12/17 20:47
字数 561
阅读 5417
收藏 7

记录一下一个折磨我N天的crontab的问题

问题是这样的

我写了个php脚本run.php ,脚本里面调用了一下hive命令(hadoop相关的东西)生成hive_result.txt,同时在hive命令执行前和执行后都会用php命令生成文件log1和log2

然后我要让这个php脚本每一分钟执行一次

于是用‘crontab -e’在配置文件里面增加了一条。

奇怪的事情通过crontab执行的情况是log1和log2都生成了但是hive_result.txt却没生成。但是在shell里面直接执行run.php那么log1  log2  hive_result.txt都可以生成。我怀疑是不是shell的环境变量和crontab的环境变量不一样,所以可能hive命令找不到。

于是做了个实验在crontab的配置文件里面加了一条

*/1 * * * *   printenv >  /home/sby_1104/env.text



这个是告诉crontab每隔一分钟把它的环境变量输出到env.txt文件里,果不其然,env.txt文件里面的内容非常少只有如下的一点东西

SHELL=/bin/sh
USER=sby_1104
PATH=/usr/bin:/bin
PWD=/home/sby_1104
SHLVL=1
HOME=/home/sby_1104
LOGNAME=sby_1104
_=/usr/bin/printenv

因此可以基本确定是环境变量不一样的导致的。crontab的环境变量的path中确实不包含hive的命令的路径。

这时我有想到重定向不仅可以重定向std输出,也可以重定向错误信息。于是我又在crontab中增加一条

*/1 * * * * hadoop fs -ls /home/abc/  > /home/sby_1104/test.txt  2>&1

这个是将错误和标准输出都输出到test.txt文件

然后查看text.txt发现如下内容

/bin/sh: hadoop: command not found


真想终于大白了,就是由于crontab执行环境的环境变量和shell执行环境变量不一样造成的。

问题的症结找到了,解决问题当然就很容易,调用命令的时候都用绝对路径就好了。







参考:

http://serverfault.com/questions/337631/crontab-execution-doesnt-have-the-same-environment-variables-as-executing-user

http://stackoverflow.com/questions/15557777/crontab-job-does-not-get-the-environment-variables-set-in-bashrc-file

http://blog.sina.com.cn/s/blog_439f80c40101g2hr.html

© 著作权归作者所有

loveczp

loveczp

粉丝 13
博文 7
码字总数 6427
作品 1
武汉
程序员
私信 提问
加载中

评论(3)

ericsoul
ericsoul

引用来自“loveczp”的评论

引用来自“ericsoul”的评论

呵呵,还有一个办法,也是常用的办法。在shell的第二行,也就是#!/bin/bash后面一行就执行 你需要的环境变量的配置文件
. /home/xxx/.profile
或者 写一个shell,里面把该使用的变量export一下。在你要使用crontab 的shell里面上来就掉一下。

高见啊

他处所学,呵呵。
loveczp
loveczp 博主

引用来自“ericsoul”的评论

呵呵,还有一个办法,也是常用的办法。在shell的第二行,也就是#!/bin/bash后面一行就执行 你需要的环境变量的配置文件
. /home/xxx/.profile
或者 写一个shell,里面把该使用的变量export一下。在你要使用crontab 的shell里面上来就掉一下。

高见啊
ericsoul
ericsoul
呵呵,还有一个办法,也是常用的办法。在shell的第二行,也就是#!/bin/bash后面一行就执行 你需要的环境变量的配置文件
. /home/xxx/.profile
或者 写一个shell,里面把该使用的变量export一下。在你要使用crontab 的shell里面上来就掉一下。
python crontab 坑

最近用Python写了一些数据统计的脚本,并使用crontab自动执行,但是配置crontab总是要过几个坑才行的,这里总结一下这次遇到的坑。 输出 要将crontab命令的输出记录到日志文件中,可以使用重...

大胡桃夹子
2017/12/06
0
0
crontab系统使用雷区(为什么cron任务没运行)

写好的程序,手动执行没问题,上crontab就报错 Crontab任务的执行环境与手动执行时的执行环境不同。 手动执行时,任务的执行环境为当前用户或指定用户的执行环境,典型的执行环境是环境变量,...

panzhc
2014/01/08
170
0
Linux定时任务Crontab

1.安装cron vixie-cron软件包是cron的主程序; crontabs软件包是用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序 2.设置为开机自启 查看crontab服务是否已设置为开机启动,执行命...

_周小董
2018/05/22
0
0
【案例分享】crontab执行脚本异常问题

很多时候我们会遇见这种情况,我们千辛万苦写了一个脚本,经过测试,一切正常,然后放到了crontab里面执行,结果,不管怎么配置,就是执行不正常。 结果发现环境问题,居然是这个异常的元凶。...

智能化IT系统
2018/08/23
0
0
Crontab Job 命令过长的处理

如果您是查crontab命令被截断的问题,请先查下命令中是否存在%没有被转义。 背景 在docker中启动容器,结合django-crontab,可以在容器中传入crontab job具体使用 请参考 django-crontab。然...

lovekwf
2018/02/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

cpu load过高问题排查

load average的概念 top命令中load average显示的是最近1分钟、5分钟和15分钟的系统平均负载。 系统平均负载被定义为在特定时间间隔内运行队列中(在CPU上运行或者等待运行多少进程)的平均进程...

mskk
今天
6
0
用spring boot 实现websocket

import java.io.IOException;import javax.websocket.OnClose;import javax.websocket.OnError;import javax.websocket.OnMessage;import javax.websocket.OnOpen;import java......

jingshishengxu
今天
4
0
shell介绍,命令历史,命令补全和别名,通配符,输入输出重定向,管道符和作业控制

shell介绍 可以使用 yum list |grep zsh 或者 yum list |grep ksh 这样可以搜索 zsh 和 ksh ,有需要的话可以安装 总之,默认使用的就是 .bash shell 命令历史 输入过的命令会被保存在一个文...

doomcat
今天
7
0
1995年的资深工程师,和你谈谈如何进阶

1995年的资深工程师,和你谈谈如何进阶 自我介绍 网络ID:杭城小刘,城市:顾名思义,人在杭州。1995年出生,本科毕业,现在是一名 iOS 资深工程师,年薪 35w。兴趣爱好广泛:乒乓球、美食、...

杭城小刘
今天
10
0
Kafka 面试题

1.Kafka中的ISR、AR代表什么? ISR:与leader保持同步的follower集合 AR:分区的所有副本 2.Kafka中的HW、LEO分别代表什么? LEO:每个副本的最后条消息的offset HW:一个分区中所有副本最小...

djm猿
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部