[CentOS] 解决 crontab 无法读取环境变量的问题
参考资料:http://blog.slogra.com/post-238.html
1. 问题描述
一段数据处理的 shell 程序,在 shell 中手动运行,可以正确执行。但是,把它放在 crontab 列表里,就会报错,提示 "matlab: command not found."。
AutoRefreshData.sh 的部分内容如下:
- [She@She ~]$ cat /home/She/data/AutoRefreshData.sh
#!/bin/bash- ...
- MatlabFile='/mnt/L/Data/main4mat.m'
- chmod +x ${MatlabFile}
- matlab -nodesktop -nosplash -nojvm < ${MatlabFile} >running.log >running.err &
在终端下,AutoRefreshData.sh 可正确执行:
- [She@She ~]$ /home/She/data/AutoRefreshData.sh
- [She@She ~]$ 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
>>
- [She@She ~]$ cat ~/running.err
[She@She ~]$
将该 shell 脚本添加到 crontab 中:
- [She@She ~]$ crontab -l
# part 2: refresh She data from FTP- 08 12 * * * /home/She/data/AutoRefreshData.sh > /dev/null 2>&
在 crontab 中,运行报错,结果如下:
- [She@She ~]$ cat ~/running.log
[She@She ~]$ 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 为例,它的头部则由
- [She@She ~]$ cat /home/She/data/AutoRefreshData.sh
- #!/bin/bash
- ...
- MatlabFile='/mnt/L/Data/main4mat.m'
- chmod +x ${MatlabFile}
- matlab -nodesktop -nosplash -nojvm < ${MatlabFile} >running.log >running.err &
改为:
- [She@She ~]$ 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} >running.log >running.err &
之后,更新 crontab 中的运行时间,立即测试,一切正常,不再报错。
- [She@She ~]$ cat ~/running.log
- < M A T L A B (R) >
- Copyright - The MathWorks, Inc.
- R2015b (8.6.0.267246) -bit (glnxa64)
- August ,
- For online documentation, see http://www.mathworks.com/support
- For product information, visit www.mathworks.com.
- >> >> >> >> >> >> >> /mnt/L/Data/matFile/jpl16228.mat
- >>
[She@She ~]$ cat ~/running.err
[She@She ~]$
Done。
[CentOS] 解决 crontab 无法读取环境变量的问题的更多相关文章
- 解决crontab不加载环境变量问题
公司需要做异构库数据同步,由于之前实际使用过,且字段类型也兼容,满足业务场景,使用了阿里开源数据同步工具:datax,服务器上crontab定时脚本执行. 由于crontab只加载/ect/envir ...
- crontab读取环境变量方法
crontab如果不注意的话早晚会出问题,而且这种问题一旦出一次,就会永远记得,因为这种问题很折腾人. ...
- Linux中crontab的坑爹环境变量问题
手动在CentOS中执行sh脚本,调用java程序,一切正常: 将该sh加入crontab中定时调度之后,挂了,完全没有执行到的感觉啊!!! 查看crontab执行日志: cat /var/log/c ...
- [十六]SpringBoot 之 读取环境变量和绑定属性对象
1.读取环境变量 凡是被spring管理的类,实现接口EnvironmentAware 重写方法 setEnvironment 可以在工程启动时,获取到系统环境变量和application配置文件中的 ...
- python 读取环境变量
python 读取环境变量 前言 在使用python时候千万不要把账户密令直接写入脚本,特别是当你计划开源自己的作品时. 为了保护账户信息,你需要让脚本从环境中导入敏感信息. 读取方法 import ...
- 【Tomcat】直接启动tomcat时为tomcat指定JDK 而不是读取环境变量中的配置
在windows环境下以批处理文件方式启动tomcat,只要运行<CATALINA_HOME>/bin/startup.bat这个文件,就可以启动Tomcat.在启动时,startup.b ...
- mac os x10.11.2系统eclipse无法读取环境变量的问题
eclipse调试Android自动化脚本的时候一直无法找到adb,遇到这么坑的问题,折腾死了,记录一下. mac os x10.11.2系统GUI程序(eclipse)无法读取~/.bash_pro ...
- 用sudo命令无法读取环境变量
通过sudo -l来查看sudo的限制: $ sudo -l Matching Defaults entries for xxx on this host: env_reset, mail_badpa ...
- crontab中引入环境变量(比如需要执行tomcat的关闭启动)
起因 crontab中的定时任务,执行到关闭tomcat时,报环境变量找不到 解决方案 1.使用 . /etc/profile 引入环境变量 ###推荐, 实测ubuntu12 成功 2.使用 sou ...
随机推荐
- 嵌入式Linux > 简易安装思路,步骤记录
思路就是把ipk文件通过ftp上传到linux上,然后通过opkg来安装. 很多的工具已经都能UI化这些操作了,命令行只是备用的工具, - 当所有工具都不好用或者遇到问题的时候,上命令行是最直接.快捷 ...
- JS正则表达式大全
转自:http://wenku.baidu.com/link?url=3y930kC7F6D3wQdMjQ3fVDmiA9Wfebs_QK0UB3N3mFaEoKg4ytZORPopxufeYA6si ...
- WebForm Repeater Response以及 地址栏
Repeater重复器: Repeater中有五个模板,这里需要注意的是4个 <HeaderTemplate> - 开头,只执行一次的内容 <ItemTemplate> - 需 ...
- 高通camera学习笔记
http://www.2cto.com/kf/201609/548725.html http://www.android100.org/html/201508/24/176303.html
- AfxBeginThread中使用updatedata出错
原因:MFC对象不支持多线程操作,不能供多个线程进程使用,所以尽量不要在线程里面更新界面. 解决办法: 1.将工程改为release 2.使用控件来SetWindowText 3.在线程里面发送消息 ...
- Boost学习笔记(一) 什么是Boost
Boost库是一个功能强大.构造精巧,跨平台.开源并且完全免费的C++程序库
- HTML 在安卓手机端软键盘弹出顶起页面布局的解决办法
$('body').height($('body')[0].clientHeight); 以上是背景即BODY被顶起的解决办法. 如果是footer被顶起,则可以用判断解决, $('input').f ...
- php : 基础(2)
常量 常量是相对于变量来说的:是一个其中存储的数据不会也不应该改变的"标识符". 常量的使用,就2个方面:定义,取值. 常量的定义 //常量定义语法1: //define(&quo ...
- JFinal - Handler 处理流程
Handler 处理流程 doFilter - Handler 链中每个 handler.handle(...) 容器初始化时访问 web.xml 配置的 JFinalFilter.doFilter. ...
- COG注释--转载
http://blog.sina.com.cn/s/blog_670445240102uxwy.html 一 COG简介 COG,即Clusters of Orthologous Groups of ...