1. 程式人生 > >Crontab內環境變數與Shell環境變數的關係及解決問題的辦法

Crontab內環境變數與Shell環境變數的關係及解決問題的辦法

  • 問題
    有時需要用到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在執行指令碼的時候,就能夠讀到使用者的環境變數引數

  • 應該注意的幾點問題

    1. 新建立的cron job,不會馬上執行,至少要過2分鐘才執行。如果重啟cron則馬上執行
    2. 每條 JOB 執行完畢之後,系統會自動將輸出傳送郵件給當前系統使用者。日積月累,非常的多,甚至會撐爆整個系統。所以每條 JOB 命令後面進行重定向處理是非常必要的: >/dev/null 2>&1 。前提是對 Job 中的命令需要正常輸出已經作了一定的處理, 比如追加到某個特定日誌檔案.
    3. 當crontab突然失效時,可以嘗試/etc/init.d/crond restart解決問題。或者檢視日誌看某個job有沒有執行/報錯tail -f /var/log/cron。
    4. 千萬別亂執行crontab -r。它從Crontab目錄(/var/spool/cron)中刪除使用者的Crontab檔案。刪除了該使用者的所有crontab都沒了。
    5. 在crontab中%是有特殊含義的,表示換行的意思。如果要用的話必須進行轉義\%,如經常用的date ‘+%Y%m%d’在crontab裡是不會執行的,應該換成date ‘+\%Y\%m\%d’
  • etc/profile, /etc/bashrc, .bash_profile和.bashrc的差別

    1. 呼叫順序
      登陸Linux系統時:
      首先啟動/etc/profile”;
      然後啟動 使用者目錄下的”~/.bash_profile” 附:(~/.bash_profile檔案先呼叫~/.bashrc,然後再把PATH載入);
      如果~/.bash_login”和”~/.profile”檔案存在的時候也會在執行”~ /.bash_profile”後被依次呼叫。
    2. 各個檔案的作用
      /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)時,執行該檔案;
    3. 區別
      /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