Crontab內環境變數與Shell環境變數的關係及解決問題的辦法
阿新 • • 發佈:2018-11-12
問題
有時需要用到Crontab的定時任務去執行指令碼,但是發現通過命令(./test.sh)執行Shell檔案的時候,可以獲取Linux的環境變數;可是通過Crontab做的定時任務,無法獲取。問題剖析
crontab有一個壞毛病,就是它總是不會預設的從使用者profile檔案中讀取環境變數引數,經常導致在手工執行某個 指令碼時是成功的,但是到crontab中試圖讓它定期執行時就是會出錯。
crontab執行環境在/etc/crontab
,具體配置如下:
配置解釋:前四行是用來配置crond任務執行的環境變數
第一行SHELL變數指定了系統要使用哪個shell,這裡是bash;
第二行PATH變數指定了系統執行命令的路徑
第三行MAILTO變數指定了crond的任務執行資訊將通過電子郵件傳送給root使用者,如果MAILTO變數的值為空,則表示不傳送任務執行資訊給使用者;
第四行的HOME變數指定了在執行命令或者指令碼時使用的主目錄。
手動執行的執行環境是當前賬戶的配置檔案~/.bash_profile幾種解決辦法
- 1、在Shell檔案裡面獲取環境變數值的路徑寫成絕對路徑,別用環境變數的路徑值。例如獲取CPU的使用情況 通過絕對路徑/proc/cpuinfo 來獲取值;
2、在即將執行的Shell指令碼預設的#!/bin/sh開頭換行後的第一行
#!/bin/sh. /etc/profile
. ~/.bash_profile
- 3、在/etc/crontab中新增環境變數
即可在PATH屬性後面新增,也可以在執行對應的命令之前,加入一條命令,使得環境變數生效,例如:
0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh
備註:在corntable 中執行多條語句時,用分號“;”隔開。故以上例子就是先執行. /etc/profile;
這條命令,然後再執行sh指令碼。
這樣,crontab在執行指令碼的時候,就能夠讀到使用者的環境變數引數
應該注意的幾點問題
- 新建立的cron job,不會馬上執行,至少要過2分鐘才執行。如果重啟cron則馬上執行。
- 每條 JOB 執行完畢之後,系統會自動將輸出傳送郵件給當前系統使用者。日積月累,非常的多,甚至會撐爆整個系統。所以每條 JOB 命令後面進行重定向處理是非常必要的:
>/dev/null 2>&1
。前提是對 Job 中的命令需要正常輸出已經作了一定的處理, 比如追加到某個特定日誌檔案. - 當crontab突然失效時,可以嘗試
/etc/init.d/crond restart
解決問題。或者檢視日誌看某個job有沒有執行/報錯tail -f /var/log/cron。 - 千萬別亂執行crontab -r。它從Crontab目錄(
/var/spool/cron
)中刪除使用者的Crontab檔案。刪除了該使用者的所有crontab都沒了。 - 在crontab中%是有特殊含義的,表示換行的意思。如果要用的話必須進行轉義\%,如經常用的
date ‘+%Y%m%d’
在crontab裡是不會執行的,應該換成date ‘+\%Y\%m\%d’
。
etc/profile, /etc/bashrc, .bash_profile和.bashrc的差別
- 呼叫順序
登陸Linux系統時:
首先啟動”/etc/profile
”;
然後啟動 使用者目錄下的”~/.bash_profile
” 附:(~/.bash_profile
檔案先呼叫~/.bashrc
,然後再把PATH載入);
如果”~/.bash_login
”和”~/.profile
”檔案存在的時候也會在執行”~ /.bash_profile
”後被依次呼叫。 - 各個檔案的作用
/etc/profile
:此檔案為系統的每個使用者設定環境資訊,當用戶第一次登入時,該檔案被執行,並從/etc/profile.d
目錄的設定檔案中搜集shell的設定;
/etc/bashrc:
為每一個執行bash shell的使用者執行此檔案,當bash shell被開啟時,該檔案被讀取;
~/.bash_profile
:每個使用者都可使用該檔案輸入專用於自己使用的shell資訊,當用戶登入時,該檔案僅僅執行一次!預設情況下,他設定一些環境變數,執行使用者的.bashrc
檔案,
~/.bashrc
:該檔案包含專用於你的bash shell的bash資訊,當登入時及每次開啟新的shell時,該檔案被讀取;
~/.bash_logout
:當每次退出系統(退出bash shell)時,執行該檔案; - 區別
/etc/profile
是全域性性的功能,其中設定的變數作用於所有使用者,~/.bash_profile
中設定的變數能繼承/etc/profile
中的變數並作用於使用者。
~/.bash_profile
是互動式、login 方式進入 bash 執行的;~/.bashrc
是互動式 non-login 方式進入 bash 執行的。
- 呼叫順序
來源:
http://blog.csdn.net/sun_168/article/details/54864766
http://www.360doc.com/content/14/0418/13/3300331_370028474.shtml