Linux下通过crontab调度脚本时脚本所使用的环境变量问题

标签: linux crontab 调度 | 发表时间:2014-01-16 21:50 | 作者:zyz511919766
出处:http://blog.csdn.net
通过crontab调度脚本时脚本使用的环境变量与直接在shell中运行脚本时使用的环境变量不同(因为crontab并不知道你所使用的shell,只是简单的设置了HOME、LOGNAME、SHELL和有限的PATH等环境变量),因而可能导致“XXX command not find”的错误或者运行结果不一致的情况。


解决办法有四:
1.在脚本中设置环境变量,如,在cron_job.sh文件中:
#!/bin/bash
source $HOME/.bash_profile
some_other_cmd

当然也可以先把环境变量设置在一个单独的文件中如/path/to/my_env.sh
$ env | sort > /tmp/cmdLineEnv.out(注意使用运行脚本时所使用的用户执行命令)
然后在待运行的脚本中执行`cat /path/to/my_env.sh`



2.在脚本中使用绝对路径运行命令
可避免PATH环境变量导致的命令无法找到的问题,但不能避免其他环境变量造成的问题。


3.在crontab文件中设置调度脚本时使用的环境变量信息,如:
SHELL=/bin/bash
LANG=nb_NO.UTF-8
LC_ALL=nb_NO.UTF-8
PATH = /sbin
0 5 * * * sleep 5s && echo "yo"

使用此方法需注意:
在crontab文件的顶部设置
该特征仅对某些特定的cron的实现有效(如Ubuntu和Debin的vixie-cron、GNU mcron支持这一特性,而Archlinux和Redhat的cronie不支持这一特性)


4.在调度语句中设置环境变量,如:
0 5 * * * . $HOME/.profile; sleep 5s && echo "yo"

使用此方法需注意:
“.”表示source命令,不可忽略,当然,也可以直接以“source”命令替代“.”
真实情况下应将“$HOME”替换为实际的全路径
保存环境变量的文件可以是$HOME/.profile,还可能是$HOME/.bash_profile、/etc/profile等或者是自己特意创建的专门用来存放环境变量的文件。

也可以直接在调度语句中设置环境变量,如:
0 5 * * * SOME_ENV_VAR=some_value some_command some_parameters

或者写一个封装脚本封装设置环境变量的命令如cron-wrapper
#!/bin/bash
[ -r $HOME/.bashrc ] && . $HOME/.bashrc
[ -r $HOME/.profile ] && . $HOME/.profile
exec "$@"
然后在计划任务调度语句中
* * * * 1-5 ~/scripts/cron-wrapper ~/scripts/myscript.sh

参考
http://www-01.ibm.com/support/docview.wss?uid=isg3T1011623
作者:zyz511919766 发表于2014-1-16 13:50:35 原文链接
阅读:0 评论:0 查看评论

相关 [linux crontab 调度] 推荐:

Linux Crontab 定时任务

- - CSDN博客推荐文章
crontab命令的功能是在一定的时间间隔调度一些命令的执行. 1.1 /etc/Crontab文件. 在/etc目录下有一个crontab文件,这里存放有系统运行的一些调度程序. 每个用户可以建立自己的调度crontab(在/var/spool/cron目录下). 以下是我本机上的crontab文件,.

Linux下通过crontab调度脚本时脚本所使用的环境变量问题

- - CSDN博客推荐文章
通过crontab调度脚本时脚本使用的环境变量与直接在shell中运行脚本时使用的环境变量不同(因为crontab并不知道你所使用的shell,只是简单的设置了HOME、LOGNAME、SHELL和有限的PATH等环境变量),因而可能导致“XXX command not find”的错误或者运行结果不一致的情况.

datax 3.0配合crontab实现数据定时增量同步

- -
使用datax 实现数据增量同步踩坑记录. 由于项目上需要将a服务器数据同步至b服务器,一开始使用mysql主从复制,但是由于主从同步无法触发位于b服务器的触发器,只能放弃此方案. 后来找到了datax可以实现数据同步同时也可以触发触发器,决定使用此方案. 安装datax,python,jdk  datax下载及安装地址.

Javascript 里跑Linux

- rockmaple - Shellex's Blog
牛逼到暴的大拿 Fabrice Bellard,用Javascript实现了一个x86 PC 模拟器,然后成功在这个模拟器里面跑Linux(请用Firefox 4 / Google Chrome 11打开,Chome 12有BUG). 关于这个东西… 伊说 “I did it for fun“,大大啊大大啊….

Linux Ksplice,MySQL and Oracle

- Syn - DBA Notes
Oracle 在 7 月份收购了 Ksplice. 使用了 Ksplice 的 Linux 系统,为 Kernel 打补丁无需重启动,做系统维护的朋友应该明白这是一个杀手级特性. 现在该产品已经合并到 Oracle Linux 中. 目前已经有超过 700 家客户,超过 10 万套系统使用了 Ksplice (不知道国内是否已经有用户了.

linux makefile编写

- hl - C++博客-首页原创精华区
在讲述这个Makefile之前,还是让我们先来粗略地看一看Makefile的规则. target也就是一个目标文件,可以是Object File,也可以是执行文件. prerequisites就是,要生成那个target所需要的文件或是目标. command也就是make需要执行的命令. 这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在 command中.

Linux下的VDSO

- 圣斌 - Adam's
VDSO(Virtual Dynamically-linked Shared Object)是个很有意思的东西, 它将内核态的调用映射到用户态的地址空间中, 使得调用开销更小, 路径更好.. 开销更小比较容易理解, 那么路径更好指的是什么呢. 拿x86下的系统调用举例, 传统的int 0×80有点慢, Intel和AMD分别实现了sysenter, sysexit和syscall, sysret, 即所谓的快速系统调用指令, 使用它们更快, 但是也带来了兼容性的问题.

Linux wget命令

- - CSDN博客推荐文章
wget是linux最常用的下载命令, 一般的使用方法是: wget + 空格 + 要下载文件的url路径. 例如: # wget  http://www.linuxsense.org/xxxx/xxx.tar.gz. 简单说一下-c参数, 这个也非常常见, 可以断点续传, 如果不小心终止了, 可以继续使用命令接着下载.

linux 小技巧

- - DBA Blog
2:如何限制用户的最小密码长度. 修改/etc/login.defs里面的PASS_MIN_LEN的值. 比如限制用户最小密码长度是8:. 3:如何使新用户首次登陆后强制修改密码. 4:更改Linux启动时用图形界面还是字符界面. 将id:5:initdefault: 其中5表示默认图形界面. 改id:3: initdefault: 3表示字符界面.

Linux iostat命令

- - CSDN博客系统运维推荐文章
iostat用于输出CPU和磁盘I/O相关的统计信息. . iostat [ -c | -d ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ device [. iostat各个参数说明:. -c 仅显示CPU统计信息.与-d选项互斥. -d 仅显示磁盘统计信息.与-c选项互斥.