好吧,你試圖同時做幾件事情,我懷疑你沒有系統地從一步到下一個活動之前測試。
首先我們要清理代碼:
def read_file(file_name)
file = File.open(file_name, "r")
data = file.read
file.close
return data
end
puts "Start"
puts read_file("/tmp/log/test.log")
puts "End"
可以替換爲:
puts "Start"
puts File.read("./test.log")
puts "End"
這是簡單明瞭的;沒有必要使用一種方法或任何複雜的方法。
注意,爲便於測試,我在當前目錄中的文件工作。爲了把它的一些內容,我會簡單地做:
echo "foo" > ./test.log
運行測試代碼給我...
Greg:Desktop greg$ ruby test.rb
Start
foo
End
,所以我知道的代碼是閱讀和打印正確。現在
我們可以測試你會進入crontab中,在我們處理它的瘋狂:
Greg:Desktop greg$ ruby test.rb > ./test.log
Greg:Desktop greg$
嗯。沒有輸出。有什麼東西被打破了。我們之前知道文件中有內容,那麼發生了什麼?
Greg:Desktop greg$ cat ./test.log
Start
End
Cat'ing文件顯示它具有「開始」和「結束」的代碼的輸出,但應該已經閱讀並輸出現在缺少的部分。
發生什麼情況是shell在將控制權傳遞給Ruby之前截斷了「test.log」,然後Ruby打開並執行代碼,該代碼打開現在空的文件以打印它。換句話說,在你閱讀它之前,你正在要求shell截斷(空)它。
解決的辦法是從不同的文件中讀取比您要寫入的文件,如果您嘗試使用其中的內容進行操作。如果你不想用它的內容做什麼,那麼使用Ruby閱讀它就沒有意義了,只需將它寫入不同的文件即可:我們有cp
和/或mv
來爲Ruby做參與的事情。因此,這使得更多的意義,如果我們要做點什麼內容:
ruby test.rb > ./test.log.out
我會使用echo "foo" > ./test.log
重置該文件的內容,並cat'ing它表現出「富」,所以我準備好了再次嘗試重定向測試:
Greg:Desktop greg$ ruby test.rb > ./test.log.out
Greg:Desktop greg$ cat test.log.out
Start
foo
End
那次它的工作。再試一次有相同的結果,所以我不會在這裏顯示結果。
如果您要通過電子郵件發送文件,您可以在此處添加該代碼。在puts File.read('./test.log')
符合分配更換puts
給一個變量將存儲文件的內容:
contents = File.read('./test.log')
然後你可以使用contents
作爲電子郵件的正文。 (而不是使用Ruby的所有這一切,我可能會使用mail
或mailx
或mailx
或使用命令行和shell直接發送到sendmail,但這是你的電話。)
在這一點上事情可以使用命令行中使用的命令將命令添加到crontab中。因爲它在cron中運行,並且可能會發生我們想知道的錯誤,所以我們也會添加2>&1
重定向來捕獲STDERR,就像以前一樣。只要記住,你可以不是寫入你要讀取的同一個文件,或者你將有一個空的文件來閱讀。
這足以讓您的應用程序正常工作。
我討厭這樣說,但也有很多事情不對的整個應用程序。你能改述你想做什麼嗎?讀取打開的文件不是你正在做的事情,也不是很有意義,所以仔細解釋你的目標可能會幫助你理解到達目標所需的步驟。 – 2010-12-18 08:51:22
我的目標是記錄腳本(它的輸出及其發生的任何錯誤),並在腳本結尾處,我希望它通過電子郵件將此日誌發送給我。 – Carmen 2010-12-18 17:23:31