crontab與環境變量

原文鏈接:http://yunhaozou.org/linux/109.html

作爲網站運維工程師,經常要與crontab打交道,通過使用crontab自動運行定時任務從而達到自動化運維的目的。在我的日常工作中也深刻地感受到了crontab的方便、高效。

但是最近在使用crontab過程中,接連遇到頭疼的問題:手動執行腳本時一點問題都沒有,可是放在crontab中腳本死活也不運行。最後查出來原因一次是因爲腳本里面文件路徑沒有寫全路徑導致的,另一次是因爲腳本運行需要依賴java環境變量,其實兩次都是環境變量的問題造成的。從網上同樣瞭解到一般crontab無法運行的問題都是由環境變量在crontab中不一定可識別引起的。某前輩總結說:crontab如果不注意的話早晚會出問題,而且這種問題一旦出一次,就會永遠記得,因爲這種問題很折騰人。精闢啊~~
下面我也來試試總結下crontab的基本用法,環境變量以及其他要注意的問題。各位看官可以參考下,有什麼問題也可以留言討論。
————————————————————————————
1.crontab的基本用法
Usage: crontab [-u user] [-e|-l|-r]
Crontab 的格式說明如下:
* 逗號(‘,’) 指定列表值。如: “1,3,4,7,8″
* 中橫線(‘-’) 指定範圍值 如 “1-6″, 代表 “1,2,3,4,5,6″
* 星號 (‘*’) 代表所有可能的值
*/15 表示每 15 分鐘執行一次
# Use the hash sign to prefix a comment
# +—————- minute (0 – 59)
# |  +————- hour (0 – 23)
# |  |  +———- day of month (1 – 31)
# |  |  |  +——- month (1 – 12)
# |  |  |  |  +—- day of week (0 – 7) (Sunday=0 or 7)
# |  |  |  |  |
# *  *  *  *  *  command to be executed
2.crontab與環境變量
不要假定cron知道所需要的特殊環境,它其實並不知道。所以你要保證在shelll腳本中提供所有必要的路徑和環境變量,除了一些自動設置的全局變量。所以注意如下3點:
1)腳本中涉及文件路徑時寫全局路徑;
2)腳本執行要用到java或其他環境變量時,通過source命令引入環境變量,如:
cat start_cbp.sh
#!/bin/sh
source /etc/profile
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh -c mev &
3)當手動執行腳本OK,但是crontab死活不執行時。這時必須大膽懷疑是環境變量惹的禍,並可以嘗試在crontab中直接引入環境變量解決問題。如:
0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh
3.其他應該注意的問題
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的差別
用戶登陸Linux操作系統的時候,”/etc/profile”, “~/.bash_profile”等配置文件會被自動執行。執行過程是這樣的:登陸Linux系統時,首先啓動”/etc/profile”,然後啓動用戶目錄下的”~/.bash_profile”,如果”~/.bash_login”和”~/.profile”文件存在的時候也會在執行”~/.bash_profile”後被依次調用。
——————
cat .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
alias vi=vim
通過上面腳本可以看到~/.bash_profile文件先調用~/.bashrc,然後再把PATH加載。
——————
下面是一些區別:
/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://yunhaozou.org/linux/109.html.轉載請保留.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章