2012-01-11 121 views
0

所以,我有一個bash腳本,應該在每小時每小時將ifconfig的輸出傳遞給一個文本文件。正如許多人似乎遇到的一樣,該腳本在被cron使用時不能正常工作。但是,我所看到的大部分修復方法似乎並不適用於我的情況。我明確指出所有路徑,腳本具有執行權限,並且cron文件末尾有一個換行符。Bash腳本不能在Cron中正確執行

創造性不夠,我的紙條,ip.sh,包含:

ifconfig > /home/drake/Dropbox/maintenance_scripts/ip.txt 

的cron項是:

0 * * * * /home/drake/Dropbox/maintenance_scripts/ip.sh 

(我有它運行的每分鐘用於調試)

的BIG問題在運行時會運行,它會清除其可能具有的任何內容的ip.txt。另外,我還有另一個腳本,它可以和正常運行時間做同樣的事情,它可以在沒有任何問題的情況下工作,這只是令人困惑。我也嘗試了>>,這似乎產生相同的結果

因此,有沒有人有任何想法,爲什麼一個腳本可能會按預期運作,而另一個只會像這樣去除?

這是在我的Ubuntu服務器上運行。我正在使用Dropbox來同步文本文件

回答

3

ip.sh腳本應該在每次運行時都敲擊ip.txt文件;然後由ifconfig程序重新填充。所以,你的問題是ifconfig沒有這樣做。

cron運行東西時的常見問題是環境。請注意,當cron運行一個命令時,不會使用該配置文件。

在這種情況下,我認爲cron下的PATH設置不包括ifconfig所在的目錄(因此/sbin不在PATH中)。顯而易見的解決方法:

  • /sbin/ifconfig ...
  • export PATH=$PATH:/sbin; ifconfig ...

我想簡單地從crontab文件運行一個腳本通常是做生意的最佳途徑。在不更改crontab設置的情況下,您可以添加調試代碼,更改環境設置,或者修改您的內容。在crontab文件中擺弄複雜的命令行很容易在某些系統或其他系統上遲早出現問題。所以我認爲你的系統是合理的 - 我在我自己的cron - 運行腳本中使用了一個更復雜的系統,但是有很多共同之處。關鍵是crontab條目很簡單,運行的腳本就是隱藏複雜性的地方。

3

你的腳本應該具有在頂部有一個「認領」行:

#!/bin/sh 

雖然它不是絕對必需的。

腳本會因爲您告訴它而覆蓋ip.txt。這就是>重定向操作符所做的。如果要追加到文件末尾,請使用>>。 (你說你試過了,結果一樣,我懷疑這是真的,我懷疑cron作業並沒有產生任何輸出,所以它沒有附加任何文件。)

但是你並不需要單獨的腳本只是爲了做重定向;你可以在cron作業本身使用>>>

0 * * * * ifconfig >> /home/drake/Dropbox/maintenance_scripts/ip.txt 

而且至少在我的系統,用於cron作業默認$PATH/usr/bin:/bin,但ifconfig/sbin/ifconfig。嘗試使用which ifconfigtype ifconfig以查看您的系統上存在哪個ifconfig(我們都使用Ubuntu,因此它可能是相同的),並使用cron作業中的完整路徑;例如:

0 * * * * /sbin/ifconfig >> /home/drake/Dropbox/maintenance_scripts/ip.txt 

如果你想看到輸出改變(我相信這是你檢查什麼),它很容易添加時間戳:

0 * * * * (date ; /sbin/ifconfig) >> /home/drake/Dropbox/maintenance_scripts/ip.txt 
+0

啊,我知道它必須是這樣的東西。它實際上駐留在/ sbin /中,並將其更改爲/ sbin/ifconfig將事物設置正確。 – Drake 2012-01-11 00:29:28

+1

您可以通過點擊旁邊的複選標記圖標來接受正確答案。一旦你有15個聲望點(這不應該花很長時間),如果你願意的話,你也可以提出一個或多個答案。 – 2012-01-11 00:45:52

3

嘗試這一個,它從我的cron工作。 請注意,ifconfig輸出可能會從Linux發行版更改爲發行版,因此您可能需要調整awk選項。

# Cron ifconfig piping is broken 
eth0ipIC=`/sbin/ifconfig eth0` 
eth0ip=`echo $eth0ipIC|awk '{print $7}'|awk -F: '{print $2}'`