這周裝伺服器,系統,應用都ok後,發現有的crontab指令碼中的命令無法執行,苦思了兩天,還是以下提供的建議解決了我的問題。
最近碰到乙個問題,shell指令碼直接執行和crontab設定好定時執行的結果不一樣,鬱悶.
指令碼是向遠端資料庫寫入記錄,直接執行可以在遠端寫入記錄,而在crontab中定時,指令碼是已經執行了,可是並沒有向遠端資料庫寫入記錄.
2008-1-17 11:25merlin852
貼你的指令碼看看
2008-1-17 11:30waker
環境不同
2008-1-17 11:41xmbbx
原帖由 merlin852 於 2008-1-17 11:25 發表 [url=
貼你的指令碼看看
/etc/crontab:
20 */1 * * * root /root/check.sh
/var/log/cron:
jan 17 08:20:00 ns000 crond[8594]: (root) cmd (/root/check.sh)
jan 17 09:20:00 ns000 crond[8621]: (root) cmd (/root/check.sh)
jan 17 10:20:00 ns000 crond[8648]: (root) cmd (/root/check.sh)
jan 17 11:20:00 ns000 crond[8675]: (root) cmd (/root/check.sh)
cat /root/check.sh:
#!/bin/bash
>/root/temp.txt
tcpdump -nnnv udp >>/root/temp.txt &
time_for_check=`date "+%r" -d'1 minute'`
sleep 120
killall tcpdump
data=`grep "$time_for_check" /root/temp.txt|grep "53:"|wc -l`
getip=`ip a|grep eth0|awk 'end'|cut -d'/' -f1`
hostname=`hostname`
mysql -h 222.*.*.* -u user -p password databaes -e "insert into data values ('','$hostname','$getip','$data',now())"
[本帖最後由 xmbbx 於 2008-1-17 11:44 編輯 ]
2008-1-17 11:52galford433
mysql的環境加到cron裡面。或者用絕對路徑/usr/bin/mysql ?
tcpdump最好也用絕對路徑。
[本帖最後由 galford433 於 2008-1-17 11:54 編輯 ]
2008-1-17 12:40gucuiwen
[size=7]
一招必殺:
在指令碼最前面加上一句:
source ~/.bash_profile
這樣執行環境就一摸一樣了。加上這句後,直接執行能成功的指令碼放在crontab裡都能執行。
[/size]
2008-1-17 12:43gucuiwen
所有的crontab問題只有兩種可能,
1,環境
2,路徑
而第二種問題往往又是第一種問題引起的,所以加上環境後,.bash_profile裡的環境後99%的問題都一招通殺。
[size=5]
.bash_profile會讀取.bashrc
.bashrc 會讀取 /etc/bashrc
/etc/bashrc 會讀取 /etc/profile
[/size]
乙個linux所有的系統使用者,所有的環境變數,都逃不出以上幾個檔案。(前提是你用bash)
2008-1-17 13:24xmbbx
感謝樓上的各位,確實是環境(路徑)的問題,已經解決.
gucuiwen解釋的很清楚,非常感謝.
shell 執行指令碼
第一行,宣告直譯器 bin bash 符號能夠被核心識別成是乙個指令碼的開始,這一行必須位於指令碼的首行,bin bash是bash程式的絕對路徑,在這裡表示後續的內容將通過bash程式解釋執行。shell指令碼的執行 1 輸入指令碼的絕對路徑或相對路徑 root helloworld.sh hel...
shell 執行指令碼的幾種方式
最近在linux下使用shell的時候,碰到一些問題,最後將shell執行指令碼的方式總結如下 1 點號 指令碼的路徑 test.sh 當前使用者需要對 test.sh有執行許可權 即x許可權 指令碼執行環境在子shell中,子shell執行完指令碼後將結果返回。2 sh 空格 指令碼的路徑 或者 ...
Shell多執行緒執行指令碼示例
shell指令碼是順序執行的,但是系統允許多個shell指令碼同時執行,為了達到資源的綜合利用,也就是把伺服器往死裡用,有時候需要一段指令碼對多個指令碼進行多執行緒的排程,並且等待完成之後繼續執行後續的指令碼。主指令碼 bin bash 用於識別子執行緒的完成數量 rm test.count tou...