[CentOS] 解决 crontab 无法读取环境变量的问题

参考资料:http://blog.slogra.com/post-238.html

1. 问题描述

一段数据处理的 shell 程序,在 shell 中手动运行,可以正确执行。但是,把它放在 crontab 列表里,就会报错,提示 "matlab: command not found."。

AutoRefreshData.sh 的部分内容如下:

[[email protected] ~]$ cat /home/She/data/AutoRefreshData.sh#!/bin/bash
...
MatlabFile=‘/mnt/L/Data/main4mat.m‘
chmod +x ${MatlabFile}
matlab  -nodesktop -nosplash -nojvm < ${MatlabFile} 1>running.log 2>running.err &

在终端下,AutoRefreshData.sh 可正确执行:

[[email protected] ~]$ /home/She/data/AutoRefreshData.sh
[[email protected] ~]$ cat ~/running.log
                            < M A T L A B (R) >                  Copyright 1984-2015 The MathWorks, Inc.                   R2015b (8.6.0.267246) 64-bit (glnxa64)                              August 20, 2015

 For online documentation, see http://www.mathworks.com/supportFor product information, visit www.mathworks.com. >> >> >> >> >> >> >> /mnt/L/Data/matFile/jpl16228.mat>> 
[[email protected] ~]$ cat ~/running.err[[email protected] ~]$  

将该 shell 脚本添加到 crontab 中:

[[email protected] ~]$ crontab -l# part 2: refresh She data from FTP
08 12 *  *  * /home/She/data/AutoRefreshData.sh                             > /dev/null 2>&1

在 crontab 中,运行报错,结果如下:

[[email protected] ~]$ cat ~/running.log[[email protected] ~]$ cat ~/running.err/home/She/data/AutoRefreshData.sh: line 111: matlab: command not found 

2. Bug 原因分析与修复

原因分析:crontab 有一个坏毛病, 就是它总是不会缺省的从用户 profile 文件中读取环境变量参数,经常导致在手工执行某个脚本时是成功的,但是到 crontab 中试图让它定期执行时就是会出错。

修复:在脚本文件的开头,强制要求导入环境变量,可保万无一失。

这样的话,脚本的头部一律以下列格式开头:

#!/bin/sh
. /etc/profile
. ~/.bash_profile

以 AutoRefreshData.sh 为例,它的头部则由

[[email protected] ~]$ cat /home/She/data/AutoRefreshData.sh
#!/bin/bash
...
MatlabFile=‘/mnt/L/Data/main4mat.m‘
chmod +x ${MatlabFile}
matlab  -nodesktop -nosplash -nojvm < ${MatlabFile} 1>running.log 2>running.err &

改为:

[[email protected] ~]$ vi /home/She/data/AutoRefreshData.sh
#!/bin/sh
. /etc/profile
. ~/.bash_profile
...
MatlabFile=‘/mnt/L/Data/main4mat.m‘
chmod +x ${MatlabFile}
matlab  -nodesktop -nosplash -nojvm < ${MatlabFile} 1>running.log 2>running.err &

之后,更新 crontab 中的运行时间,立即测试,一切正常,不再报错。

[[email protected] ~]$ cat ~/running.log

                            < M A T L A B (R) >
                  Copyright 1984-2015 The MathWorks, Inc.
                   R2015b (8.6.0.267246) 64-bit (glnxa64)
                              August 20, 2015

For online documentation, see http://www.mathworks.com/support
For product information, visit www.mathworks.com.

>> >> >> >> >> >> >> /mnt/L/Data/matFile/jpl16228.mat
>> [[email protected] ~]$ cat ~/running.err[[email protected] ~]$ 

Done。

时间: 2024-10-01 04:44:41

[CentOS] 解决 crontab 无法读取环境变量的问题的相关文章

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 "

[十六]SpringBoot 之 读取环境变量和绑定属性对象

1.读取环境变量 凡是被spring管理的类,实现接口EnvironmentAware 重写方法 setEnvironment 可以在工程启动时,获取到系统环境变量和application配置文件中的变量. 主要是@Configuration,实现接口:EnvironmentAware就能获取到系统环境信息 package me.shijunjie.config; import org.springframework.beans.factory.annotation.Value; import

python 读取环境变量

python 读取环境变量 前言 在使用python时候千万不要把账户密令直接写入脚本,特别是当你计划开源自己的作品时. 为了保护账户信息,你需要让脚本从环境中导入敏感信息. 读取方法 import os os.environ["EMAIL_PASSWORD"] window环境 Linux环境 原文地址:https://www.cnblogs.com/yywBlogW/p/11438410.html

CentOS安装JDK1.7设置环境变量及profile和bashrc文件的区别

1.查看当前系统中是否装有JDK(通常CentOS中默认安装OpenJDK) # java –version 如果存在OpenJDK需要先卸载: # rpm -qa|grep jdk 或 rpm -qa|grep java java-1.6.0-openjdk-1.*** java-1.7.0-openjdk-1.*** # rpm -qa|grep gcj java-1.*** libgcj-*** # yum -y remove java java-1.6.0-openjdk-1.*** #

java 读取环境变量和系统变量的方法

在web开发的过程中不免需要读取一些自定义的jvm系统变量或者环境变量.比如定义一些通用的log文件.或者数据库访问路径. 我们可以使用System.getProperties()读取所有的系统变量.通过System.getProperty("name");获取特定的系统变量 System.getenv();获取环境变量.System.getenv("name")获取特定的环境变量

【Tomcat】直接启动tomcat时为tomcat指定JDK 而不是读取环境变量中的配置

在windows环境下以批处理文件方式启动tomcat,只要运行<CATALINA_HOME>/bin/startup.bat这个文件,就可以启动Tomcat.在启动时,startup.bat会调用catalina.bat文件,而catalina.bat会调用setclasspath.bat文件来获取JAVA_HOME和JRE_HOME这两个环境变量的值,因此若要在tomcat启动时指向特定的JDK,则需在setclasspath.bat文件的开头处加入以下内容: rem ----------

mac os x10.11.2系统eclipse无法读取环境变量的问题

eclipse调试Android自动化脚本的时候一直无法找到adb,遇到这么坑的问题,折腾死了,记录一下. mac os x10.11.2系统GUI程序(eclipse)无法读取~/.bash_profile下配置的环境变量. 需要用终端open /User/sun/tools/eclipse/eclipse启动,才会加载环境变量,手动启动则不加载.

Centos 7 安装jdk 配置环境变量

在Centos7 终端中,我们输入java -version可以看到java的版本,但是输入javac却没有反应 原因是系统中预装的是openjdk jre不是真正的jdk,所以还得自己装好,然后配置好变量才行 1.yum list java-* 2.安装相应版本的jdk,一般含有devel的就是真正的jdk,如:java-1.8.0-openjdk-devel.x86_64 命令:yum install java-1.8.0-openjdk-devel.x86_64 3.vim /etc/pr

centos 为OPENJDK配置JAVA_HOME环境变量,安装MAVEN

1.安装开发者工具包 yum install java-1.7.0-openjdk-devel -y 2.配置环境变量 vim /etc/profile export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.95.x86_64 export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$JAV