1. 程式人生 > >Linux下通過crontab排程指令碼時指令碼所使用的環境變數問題

Linux下通過crontab排程指令碼時指令碼所使用的環境變數問題

通過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 "
[email protected]
"
然後在計劃任務排程語句中
* * * * 1-5 ~/scripts/cron-wrapper ~/scripts/myscript.sh

參考
http://www-01.ibm.com/support/docview.wss?uid=isg3T1011623

相關推薦

Linux通過crontab排程指令碼指令碼使用的環境變數問題

通過crontab排程指令碼時指令碼使用的環境變數與直接在shell中執行指令碼時使用的環境變數不同(因為crontab並不知道你所使用的shell,只是簡單的設定了HOME、LOGNAME、SHELL和有限的PATH等環境變數),因而可能導致“XXX command no

linux利用crontab定時執行PHP指令碼

1、使用crontab –e編輯定時任務   內容為:   xx:xx:xx 執行一個test.php檔案   2、php檔案必須在檔案頭一行,加上直譯器路徑(就象perl做的那樣)   #!/usr/local/bin/php   PHP的

Linux使用crontab命令定時執行指令碼

crontab是什麼 crontab怎麼使用 假設現在有這麼個場景:每天早上6點,執行一段指令碼,這段指令碼輸出Hello World到控制檯上。 可以這麼做: 編寫列印資訊的shell指

Linux通過crontab及expect實現自動化處理

目標 為實現每天定時從其他伺服器上覆制檔案到本地,需要使用crontab建立定時任務,並通過scp進行Linux之間的檔案複製。在複製檔案時,可能需要輸入目標伺服器上的密碼,通過expect即可實現。 步驟說明 準備工作 檢查並安裝expect及

Linux boost 庫的安裝,配置個人環境變數

部分引自: https://blog.csdn.net/this_capslock/article/details/47170313 1. 下載boost安裝包並解壓縮到http://www.boost.org/下載boost的安裝包,以boost_1_58_0.tar.gz為例 下載完成後進行解

linuxgetenv、putenv、setenv獲取設定環境變數

getenv(取得環境變數內容)  相關函式 putenv,setenv,unsetenv  表頭檔案 #include<stdlib.h>  定義函式 char * getenv(const char *name);  函式說明 getenv()用來取得引數n

linux/etc/profile與/etc/bashrc各種配置環境變數的檔案

/etc/profile:此檔案為系統的每個使用者設定環境資訊,當用戶第一次登入時,該檔案被執行,並從/etc/profile.d目錄的配置檔案中收集shell的設定; /etc/bashrc:為每一個執行bash shell的使用者執行此檔案,當bash shell被開啟

Linux和編譯器、程式的執行、環境變數等相關的常見問題

(不斷更新) 索引: (1) Linux下環境變數相關的問題 (2) Linux下GNU工具鏈相關的問題(GNU Toolchain)(gcc/g++/ld/make等等工具) (3) Linux下可執行檔案的格式(主要是ELF格式,還有a.out/coff等)和可執行檔案

Linux通過shell進MySQL執行SQL或匯入指令碼

這條命令表示通過使用者名稱和密碼執行shell然後在shell裡面執行一個建表語句: USER="root" PASS="root" mysql -u $USER -p$PASS <<EOF 2> /dev/null CREATE DATABASE um; EOF 下面的命令在登陸My

linux新增crontab定時任務,php指令碼

linux 下新增crontab定時任務 1. 切換到www使用者    sudo su www 2. 新增crontab crontab -e   按a進入insert模式  加入定時任務如下: */1 * * * * /usr/local/php/bin/php -f

MAC OS和Linuxcrontab實現定時任務(執行python等指令碼)

前言 crontab命令常見於Unix和類Unix的作業系統中,用於設定週期性被執行的指令。該命令從標準輸入裝置讀指令,並將其存入到“crontab”檔案中,以供之後讀取和執行。 使用方法 1.crontab -e 編輯自定義自己的任務,儲存退出後自動新增到cron

linux通過指令碼監控程式執行

shanzhizi大神的,寫的很實用,謝謝大神。 應用程式執行過程中,任何人都無法保證它永遠不死定,因此自動重啟就十分必要。以下是自動重啟的shell指令碼實現方法,shell指令碼來自網路。 假定需要實現重啟的程式名為 test ,我們這裡通過判斷程序

Linux通過EXPECT指令碼自動執行ssh遠端連線

       由於經常需要從家裡連到實驗室的機器,但是中間需要一箇中轉,於是就需要連續兩次進行ssh操作以及輸入密碼。加上家裡網路不穩,經常會斷,就又得重新登入。輸入那麼一長串的東西特別麻煩。於是覺得應該寫一個指令碼來自動登入,這樣就可以帶來極大的方便。 1 expec

Linux通過Shell指令碼快速進入指定目錄

現在有一個現實的場景: 每一次開啟Linux,都是在 目錄下; 我最近想練習網路的程式碼,所以建立了一個目錄,路徑為: 可以看到,這個路徑很長,如果沒一次都通過cd /home/admin/linex/internet/practice,那太麻煩了!

LinuxOracle資料庫自動備份Shell指令碼

1.在伺服器建立備份目錄,並賦予許可權 mkdir -p /backup/P_DATA  #新建shell指令碼存放路徑 mkdir -p /backup/P_DB_BACK  #新建Oracle資料庫備份目錄 chown -R oracle:oinstall /backup/P

linux同時執行多個python指令碼

#!/bin/bash python mysql.py > /dev/null 2>&1 & python mysql1.py > /dev/null 2>&1 & python mysql2.py

分享一個Linux安裝ASM+ORACLE的自動化指令碼(一)

    近期在脫產參加Oracle技術培訓,專家級講師說Oracle資料庫60%的問題都是出在安裝過程不規範,讓我們多練習資料庫的安裝,孰能生巧,並且可以對以後安裝資料庫時可能遇到的問題進行及時準確地定位。     Linux下安裝Oracle資料庫不同於Windows,最

linux將自己寫的shell指令碼做成系統命令

sublime啟動為例子 首先,我們一般會將本地的shell放在/usr/local/sbin/目錄下 #! /bin/bash SUBLIME_HOME = "~/Software

Linux Java 程序啟動停止shell指令碼

1.start.sh appname=paas-portal apppath=/data/docker/shared/apps/paas/$appname configlocation=--spr

linux自用簡單go app編譯指令碼

#!/bin/bash #預設$GOROOT已經存在,併為/usr/local/go/ #log檔案目錄 LOG_DIR=./log #DAYS=15代表刪除15天前的log檔案 DAYS=15 #