Linux中crontab的坑爹环境变量问题

手动在CentOS中执行sh脚本,调用java程序,一切正常;

将该sh加入crontab中定时调度之后,挂了,完全没有执行到的感觉啊!!!

查看crontab执行日志:

cat /var/log/cron

有执行记录,擦擦擦~~~

难道用crontab调用执行会报错,打印日志先:

crontab -e

40 10 * * * /home/job.sh 2>>/home/log

再调度一次,查看日志:

cat /home/log

还真报错了:

Exception in thread "main" java.lang.ClassFormatError: SystemInfo (unrecognized class file version)

...

TMD,不能识别的java版本,大胆的怀疑crontab用的环境变量是他自个的:

cat /etc/crontab

果然,crontab自己有一个PATH变量,修改之:

vim /etc/crontab

重新用crontab调用程序,报错依旧,重启之:

service crond restart

再调用,继续报错,难道crontab的PATH是个摆设!

google之,baidu之,原来这是个坑人无数的问题,以下是查到的一些有用的资料:

http://xiachaofeng.iteye.com/blog/1405184

今天遇见一个问题,crontab的定时任务不能自动执行,但是手动执行脚本一直能成功。查到最后,发现是脚本里用了系统的环境变量。下面开始解释:

0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh

2)
每条 JOB 执行完毕之后,系统会自动将输出发送邮件给当前系统用户。日积月累,非常的多,甚至会撑爆整个系统。所以每条 JOB
命令后面进行重定向处理是非常必要的: >/dev/null 2>&1 。前提是对 Job
中的命令需要正常输出已经作了一定的处理,
比如追加到某个特定日志文件。
3)当crontab突然失效时,可以尝试/etc/init.d/crond restart解决问题。或者查看日志看某个job有没有执行/报错tail -f /var/log/cron。
4)千万别乱运行crontab -r。它从Crontab目录(/var/spool/cron)中删除用户的Crontab文件。删除了该用户的所有crontab都没了。
5)在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义\%,如经常用的date ‘+%Y%m%d’在crontab里是不会执行的,应该换成date ‘+\%Y\%m\%d’`。

3.crontab中的输出配置

crontab中经常配置运行脚本输出为:>/dev/null 2>&1,来避免crontab运行中有内容输出。

shell命令的结果可以通过‘> ’的形式来定义输出

/dev/null 代表空设备文件  

> 代表重定向到哪里,例如:echo "123" > /home/123.txt 

1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"

2 表示stderr标准错误

  & 表示等同于的意思,2>&1,表示2的输出重定向等同于1 

那么重定向输出语句的含义:

1>/dev/null 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,不显示任何信息。

2>&1 表示标准错误输出重定向等同于标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。

时间: 2024-08-02 16:48:23

Linux中crontab的坑爹环境变量问题的相关文章

Linux中如何设置java环境变量

这里介绍Linux下如何设置java环境变量. 工具/原料 Linux java环境变量 方法/步骤 1 查看java的安装路径   查看java执行路径   配置java环境变量   java的安装路径和执行路径   注意这里的JAVA_HOME后面一定要带上bin路径,路径设置完成一定要用 export输出,注意export单词不要写错了   设置环境变量后使用java的v参数测试,还是失败,因为没有执行source命令   环境变量修改后执行source命令,使得配置生效   运行sour

Ubuntu Linux系统包含两类环境变量

Ubuntu Linux系统包含两类环境变量:系统环境变量和用户环境变量.系统环境变量对所有系统用户都有效,用户环境变量仅仅对当前的用户有效. 修改用户环境变量 用户环境变量通常被存储在下面的文件中: ~/.profile ~/.bash_profile 或者 ~./bash_login ~/.bashrc 上述文件在Ubuntu 10.0以前版本不推荐使用. 系统环境变量 系统环境变量一般保存在下面的文件中: /etc/environment /etc/profile /etc/bash.ba

linux查看和修改PATH环境变量的方法

linux查看和修改PATH环境变量的方法 查看PATH:echo $PATH以添加mongodb server为列修改方法一:export PATH=/usr/local/mongodb/bin:$PATH//配置完后可以通过echo $PATH查看配置结果.生效方法:立即生效有效期限:临时改变,只能在当前的终端窗口中有效,当前窗口关闭后就会恢复原有的path配置用户局限:仅对当前用户 修改方法二:通过修改.bashrc文件:vim ~/.bashrc //在最后一行添上:export PAT

【转】Mac OS X 中 Zsh 下 PATH 环境变量的正确设置

在 Mac OS X 中使用 zsh,环境变量 PATH 一不小心就会变得很紊乱,表现为自己设置的路径总是被放到系统路径之后,部分路径还会有重复.这是我们不太了解 zsh 启动时加载文件的顺序和 Mac OS X 的 shell 类型导致的. zsh 启动过程中会依次读取以下文件: /etc/zshenv $ZDOTDIR/.zshenv($ZDOTDIR 未设置时默认为 $HOME) 如果是 login shell,读取 /etc/zprofile, $ZDOTDIR/.zprofile 如果

linux[基础]-12-重要的环境变量[01]

重要的环境变量 在linux系统中有许多的环境变量,我们可以用env 来查看他 变量是由固定的"变量名"和用户设定的"变量值"两部分组成 变量名称 作用 HOME 用户的主目录"家" SHELL 当前的SHELL是那个程序 HISTSIZE 历史命令记录条数 MAIL 邮件信箱文件 LANG 语系数据 RANDOM 随机数字 PS1 Bash提示符 HISTFILESIZE History命令存储数量 PATH 在当前目录中查找执行文件 EDIT

linux设置python虚拟环境的环境变量

针对 linux系统中 python虚拟环境 设置环境变量 2种方法: 1.在建好的虚拟环境的 venv/bin/active 文件中,写入需要的环境变量,再进入虚拟环境: 如 配置文件路径 JERRY_CONFIG="/mnt/e/jerry/config/config.local.yml" export JERRY_CONFIG 步骤如下图; 打开文件: 找个地方 设置环境变量 重新进入虚拟环境:发现添加成功 2.在 通过 source xxx/venv/bin/active 进入

win系统环境变量中增加或修改环境变量后快速生效

win系统环境变量中增加或修改环境变量后,需重启系统才能使之生效. 下面介绍一种方法: 以修改环境变量"PATH"为例,修改完成后,进入DOS命令提示符,输入:set PATH=C: ,关闭DOS窗口.再次打开DOS窗口,输入:echo %PATH% ,值已经生效. 不用担心DOS窗口中的修改会影响环境变量的值,DOS窗口中的环境变量只是Windows环境变量的一个副本而已.但是对副本的修改却会引发Windows环境变量的刷新,这正是我们想要的!

Linux系统中增加和删除环境变量PATH路径详解

http://blog.csdn.net/pipisorry/article/details/39507699 Linux系统中要把/etc/apache/bin目录添加到PATH中: 1.#PATH=$PATH:/etc/apache/bin 使用这种方法,只对当前会话有效,也就是说每当登出或注销系统以后(关闭terminal就会失效),PATH 设置就会失效 2.#vi /etc/profile 在适当位置添加 PATH=$PATH:/etc/apache/bin (注意:= 即等号两边不能

Linux下设置和查看环境变量

Linux的变量种类 按变量的生存周期来划分,Linux变量可分为两类: 1 永久的:需要修改配置文件,变量永久生效. 2 临时的:使用export命令声明即可,变量在关闭shell时失效. 设置变量的三种方法 1 在/etc/profile文件中添加变量[对所有用户生效(永久的)] 用VI在文件/etc/profile文件中增加变量,该变量将会对Linux下所有用户有效,并且是"永久的". 例如:编辑/etc/profile文件,添加CLASSPATH变量 # vi /etc/pro