1. 程式人生 > >[CentOS] 解決 crontab 無法讀取環境變數的問題【轉】

[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/support
For 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。


相關推薦

[CentOS] 解決 crontab 無法讀取環境變數的問題

參考資料:http://blog.slogra.com/post-238.html 1. 問題描述   一段資料處理的 shell 程式,在 shell 中手動執行,可以正確執行。但是,把它放在 crontab 列表裡,就會報錯,提示 "matlab: comm

解決crontab無法讀取環境變數

問題描述 設定一個crontab,*/1 * * * * /bin/bash  /home/test/1.sh, 手動 sh  /home/test/1.sh可以執行,但放到crontab裡卻無法執行, 問題所在: crontab預設使用者profile檔案中的環

UNIX下的LD_PRELOAD環境變數

前言        也許這個話題並不新鮮,因為LD_PRELOAD所產生的問題由來已久。不過,在這裡,我還是想討論一下這個環境變數。因為這個環境變數所帶來的安全問題非常嚴重,值得所有的Unix下的程式設計師的注意。 在開始講述為什麼要當心LD_PRELOAD環

spring+log4j配置檔案無法讀取環境變數問題

在spring-web專案中,log4j的配置位於log4j.properties檔案中,其中日誌路徑使用環境變數配置(配置在/etc/profile)。但是,實際執行該路徑沒有生效。如果直接寫路徑,是沒有問題的。 log4j.appender.logFile.File =

centos修改為網易YUM源

文件 all centos 網易yum源 base 運行 緩存 使用說明 yum 使用說明 首先備份/etc/yum.repos.d/CentOS-Base.repo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d

dubbo的一些預設變數

變數名 描述 預設值 用途 DEFAULT_IO_THREADS 預設IO執行緒 Math.min(Runtime.getRuntime().availableProcessors() + 1, 32) 建立

centos安裝配置hadoop超詳細過程

轉自:http://www.centoscn.com/image-text/install/2014/1121/4158.html 1、叢集部署介紹 1.1 Hadoop簡介           Hadoop是Apache軟體基金會旗下的一個開源分散式計算平臺。以Hadoop分散式檔案系統

Linux系統下Jsp環境部署

對於應用程式來說,context路徑是一個關鍵屬性,其也經常用於虛擬主機的配置及.war檔案中的URL對映。使用context可以降低系統負載,因為,當某URL請求到達tomcat時,如果沒有context,tomcat需要搜尋server.xml或context.xml的配置以確定此URL,否則則需要搜尋所

MAC環境AndroidStudio無法載入Android專案問題的解決

最近這段時間,這個問題遇到過兩次。因為之前一直使用Windows開發環境且並沒有出現一次這種問題,而Mac環境出現了兩次,所以特別記錄一下這個問題的解決方式。 1、問題復現 首先,我們來看一看出問題時,AS是什麼情況。老規矩,上圖: (可以看到,直接是

JavaFAQ環境變數設定問題錯誤:找不到或無法載入主類 "xxxxxx"

1、問題現象 首先宣告,程式碼絕對是沒有問題的。 F:\01 Java\01 Project\00 ConnectDatabase>java OperateOracle 錯誤: 找不到或無法載入主類 OperateOracle 2、解決辦法     出現此問題

STM32F407 讀保護,寫保護,解鎖過程芯片已設置讀保護,無法讀取更多信息

寫保護 stm32f407 讀保護 解鎖過程 硬件準備:CH340 USB轉TTL串口一個STM32F407 板子一塊設置從ISP啟動軟件準備:1,flash_loader_demo_v2.8.0.exe 或者 FlashLoader Demonstrator 2.8.0.msi 都可以下載地址:

Kafka某topic無法消費解決方案&Kafka某Topic數據清理

清0 logs -s 重點 找到 使用 on和off image ica 由於項目原因,最近經常碰到Kafka消息隊列某topic在集群宕機重啟後無法消費的情況。碰到這種情況,有三步去判斷原因所在: step A:如果用kafka串口(即console-consumer)

python os 設定讀取環境變數的幾種方法

專案中的跳板機是用的使用者公私鑰鑑權的,登入跳板機需要使用的每個人的name,因此如果將封裝的MySQL或者Redis方法中傳入USERNAME作為引數的話,感覺有點傻。因此,考慮將名字寫入環境變數。 兩種方法: 1、使用os.environ.setdefault方法寫入(或者直接

新版Mac上IDE中無法獲取環境變數的問題

新版Mac上IDE中無法獲取環境變數的問題 Mac下為IDE或者應用設定環境變數 Eclipe環境變數 Android Studio環境變數 Mac OS X environment variables and SAP GUI for Java 新增環境變數 launchctl se

CentOS檢視和修改PATH環境變數的方法 (

  檢視PATH:echo $PATH以新增mongodb server為列修改方法一:export PATH=/usr/local/mongodb/bin:$PATH//配置完後可以通過echo $P

centos啟動網絡卡報錯(Failed to start LSB: Bring up/down networking )解決辦法總結

今天一臺一直在用的虛擬機器重啟後,CRT連線不上,ip也ping不通,重啟網絡卡報錯,“Failed to start LSB: Bring up/down networking”,參考:http://blog.51cto.com/11863547/1905929,解決。 遇到這個錯誤好幾次,所以總結了一下

dede自定義模型會員無法投稿的解決方法

原文連結:點選跳轉 具體方法: 1、複製普通文章模型,增加了一個欄位,允許投稿,級別為註冊會員,組別不限制. 2、新建一個欄目,內容模型為此模型,且允許投稿. 3、在 系統設定->基本引數->會員設定中 “是否開放會員對自定義模型投稿:” 選擇了 “是”. 4、

Windows環境下Python 安裝庫 is not a supported wheel on this platform解決辦法

Windows環境下Python 安裝庫 is not a supported wheel on this platform解決辦法 在使用python進行pdf轉換圖片時,需要PythonMagick庫,但下載了許多whl都無法解決 解決方案 可能的原因

linux 環境變數設定方法總結(PATH/LD_LIBRARY_PATH)

PATH和LD_LIBRARY_PATH本質都是變數,所謂變數的意思就是由別人賦值產生的,直覺往往會讓我們新增和減少這個變數本身的某些路徑,實際上這是不正確的。正確的做法是我們要去修改賦予這個變數數值的那些配置檔案,加一條路徑或者減一條。說到底變數只關乎顯示,不關乎其

CentOS檢視和修改PATH環境變數的方法

檢視PATH:echo $PATH 以新增mongodb server為列 修改方法一: export PATH=/usr/local/mongodb/bin:$PATH //配置完後可以通過echo $PATH檢視配置結果。 生效方法:立即生效 有效期限:臨時改變,只能在當