為了定時監(jiān)控Linux系統(tǒng)CPU、內(nèi)存、負載的使用情況,寫了個Shell腳本,當達到一定值得時候,發(fā)送郵件通知。需要用到Crontab的定時任務(wù)去執(zhí)行這個腳本,但是發(fā)現(xiàn)通過命令(./test.sh)執(zhí)行Shell文件的時候,可以獲取Linux的環(huán)境變量;可是通過Crontab做的定時任務(wù),無法獲取。 查找資料之后發(fā)現(xiàn),crontab有一個壞毛病,就是它總是不會缺省的從用戶profile文件中讀取環(huán)境變量參數(shù),經(jīng)常導(dǎo)致在手工執(zhí)行某個 腳本時是成功的,但是到crontab中試圖讓它定期執(zhí)行時就是會出錯。 2種方法可以解決這個問題, 1、在Shell文件里面獲取環(huán)境變量值的路徑寫成絕對路徑,別用環(huán)境變量的路徑值。例如獲取CPU的使用情況 通過絕對路徑/proc/cpuinfo 來獲取值; 2、Shell腳本缺省的#!/bin/sh開頭換行后的第一行用 #!/bin/sh . /etc/profile . ~/.bash_profile 這樣,crontab在執(zhí)行腳本的時候,就能夠讀到用戶的環(huán)境變量參數(shù) 備注: 如果你是在cron里提交的,請注意: 不要假定c r o n知道所需要的特殊環(huán)境,它其實并不知道。所以你要保證在s h e l l腳本中提供所有必要的路徑和環(huán)境變量,除了一些自動設(shè)置的全局變量。
分享一些關(guān)于Crontab的小知識 但是最近在使用crontab過程中,接連遇到頭疼的問題:手動執(zhí)行腳本時一點問題都沒有,可是放在 crontab中腳本死活也不運行。最后查出來原因一次是因為腳本里面文件路徑?jīng)]有寫全路徑導(dǎo)致的,另一次是因為腳本運行需要依賴java環(huán)境變量,其實 兩次都是環(huán)境變量的問題造成的。從網(wǎng)上同樣了解到一般crontab無法運行的問題都是由環(huán)境變量在crontab中不一定可識別引起的。某前輩總結(jié) 說:crontab如果不注意的話早晚會出問題,而且這種問題一旦出一次,就會永遠記得,因為這種問題很折騰人。精辟啊~~ 下面我也來試試總結(jié)下crontab的基本用法,環(huán)境變量以及其他要注意的問題。各位看官可以參考下,有什么問題也可以留言討論。 ———————————————————————————— 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 分鐘執(zhí)行一次 # 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與環(huán)境變量 不要假定cron知道所需要的特殊環(huán)境,它其實并不知道。所以你要保證在shelll腳本中提供所有必要的路徑和環(huán)境變量,除了一些自動設(shè)置的全局變量。所以注意如下3點: 1)腳本中涉及文件路徑時寫全局路徑; 2)腳本執(zhí)行要用到j(luò)ava或其他環(huán)境變量時,通過source命令引入環(huán)境變量,如: 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)當手動執(zhí)行腳本OK,但是crontab死活不執(zhí)行時。這時必須大膽懷疑是環(huán)境變量惹的禍,并可以嘗試在crontab中直接引入環(huán)境變量解決問題。如: 0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh 3.其他應(yīng)該注意的問題 1)新創(chuàng)建的cron job,不會馬上執(zhí)行,至少要過2分鐘才執(zhí)行。如果重啟cron則馬上執(zhí)行。 2)每條 JOB 執(zhí)行完畢之后,系統(tǒng)會自動將輸出發(fā)送郵件給當前系統(tǒng)用戶。日積月累,非常的多,甚至?xí)伪麄€系統(tǒng)。所以每條 JOB 命令后面進行重定向處理是非常必要的: >/dev/null 2>&1 。前提是對 Job 中的命令需要正常輸出已經(jīng)作了一定的處理, 比如追加到某個特定日志文件。 3)當crontab突然失效時,可以嘗試/etc/init.d/crond restart解決問題?;蛘卟榭慈罩究茨硞€job有沒有執(zhí)行/報錯tail -f /var/log/cron。 4)千萬別亂運行crontab -r。它從Crontab目錄(/var/spool/cron)中刪除用戶的Crontab文件。刪除了該用戶的所有crontab都沒了。 5)在crontab中%是有特殊含義的,表示換行的意思。如果要用的話必須進行轉(zhuǎn)義\%,如經(jīng)常用的date ‘+%Y%m%d’在crontab里是不會執(zhí)行的,應(yīng)該換成date ‘+\%Y\%m\%d’`。 —————————————————————————————– /etc/profile, /etc/bashrc, .bash_profile和.bashrc的差別 用戶登陸Linux操作系統(tǒng)的時候,”/etc/profile”, “~/.bash_profile”等配置文件會被自動執(zhí)行。執(zhí)行過程是這樣的:登陸Linux系統(tǒng)時,首先啟動”/etc/profile”,然后啟動 用戶目錄下的”~/.bash_profile”,如果”~/.bash_login”和”~/.profile”文件存在的時候也會在執(zhí)行”~ /.bash_profile”后被依次調(diào)用。 —————— 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文件先調(diào)用~/.bashrc,然后再把PATH加載。 —————— 下面是一些區(qū)別: /etc/profile:此文件為系統(tǒng)的每個用戶設(shè)置環(huán)境信息,當用戶第一次登錄時,該文件被執(zhí)行,并從/etc/profile.d目錄的設(shè)置文件中搜集shell的設(shè)置; /etc/bashrc:為每一個運行bash shell的用戶執(zhí)行此文件,當bash shell被打開時,該文件被讀?。?/div> ~/.bash_profile:每個用戶都可使用該文件輸入專用于自己使用的shell信息,當用戶登錄時,該文件僅僅執(zhí)行一次!默認情況下,他設(shè)置一些環(huán)境變量,執(zhí)行用戶的.bashrc文件, ~/.bashrc:該文件包含專用于你的bash shell的bash信息,當?shù)卿洉r及每次打開新的shell時,該文件被讀??; ~/.bash_logout:當每次退出系統(tǒng)(退出bash shell)時,執(zhí)行該文件; ——– /etc/profile是全局性的功能,其中設(shè)置的變量作用于所有用戶,~/.bash_profile中設(shè)置的變量能繼承/etc/profile中的變量并作用于用戶。 ~/.bash_profile 是交互式、login 方式進入 bash 運行的;~/.bashrc 是交互式 non-login 方式進入 bash 運行的。
|
|
來自: Harrison.Ding > 《Linux》