2010-12-18 69 views
18

讀打開的文件我希望能夠讀取當前打開的文件。 test.rb將其輸出發送到test.log,我希望能夠閱讀並最終通過電子郵件發送。如何在Ruby中

我運行這個使用的cron:

*/5 * * * /tmp/test.rb > /tmp/log/test.log 2>&1 

我在test.rb是這樣的:

#!/usr/bin/ruby 

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" 

當我運行這段代碼,它只是給了我這樣的輸出:

Start 

End 

我期望輸出是這樣的:

Start 
Start (from the reading of the test.log since it should have the word start already) 
End 
+1

我討厭這樣說,但也有很多事情不對的整個應用程序。你能改述你想做什麼嗎?讀取打開的文件不是你正在做的事情,也不是很有意義,所以仔細解釋你的目標可能會幫助你理解到達目標所需的步驟。 – 2010-12-18 08:51:22

+0

我的目標是記錄腳本(它的輸出及其發生的任何錯誤),並在腳本結尾處,我希望它通過電子郵件將此日誌發送給我。 – Carmen 2010-12-18 17:23:31

回答

4

在您已經在Ruby腳本中讀取之前,您已經打開並清除了test.log(通過重定向)的cron作業。

爲什麼不這樣做既讀和紅寶石寫?

+0

請耐心等待,因爲我真的是這個新手。但是,我怎樣才能完成你在Ruby中閱讀和編寫它的建議? – Carmen 2010-12-18 01:13:33

3

的問題是,我所看到的,已經被Slomojo解決。我只補充:
讀取和紅寶石打印文本文件,只是:

puts File.read("/tmp/log/test.log") 
+0

所以,我試過這個,但我仍然得到相同的輸出。這是因爲輸出是緩衝的,所以當文件被讀取時,日誌文件中還沒有任何東西存在? – Carmen 2010-12-18 01:11:07

+0

@Carmen,我是Windows熟練的,對不起,我對你的cron一無所知) – Nakilon 2010-12-18 01:20:35

+0

@Carmen,沒有涉及緩衝。當設置了STDOUT和STDERR重定向時,cronjob就會關閉,並且操作系統會截斷該文件,這恰好在OS啓動應用程序之前發生。 – 2010-12-18 08:35:52

3

它可能是一個權限問題或文件可能不存在。

f = File.open("test","r") 
puts f.read() 
f.close() 

以上將讀取文件測試。如果該文件在當前目錄中存在

+0

這不是權限問題或文件存在問題。在讀取它之前,這是計時和shell立即截斷文件的問題。 – 2010-12-18 20:44:30

38

好吧,你試圖同時做幾件事情,我懷疑你沒有系統地從一步到下一個活動之前測試。

首先我們要清理代碼:

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的所有這一切,我可能會使用mailmailxmailx或使用命令行和shell直接發送到sendmail,但這是你的電話。)

在這一點上事情可以使用命令行中使用的命令將命令添加到crontab中。因爲它在cron中運行,並且可能會發生我們想知道的錯誤,所以我們也會添加2>&1重定向來捕獲STDERR,就像以前一樣。只要記住,你可以不是寫入你要讀取的同一個文件,或者你將有一個空的文件來閱讀。

這足以讓您的應用程序正常工作。

+1

積極說明! – 2010-12-18 22:58:34

+0

我會叫它囉嗦。 :-) – 2010-12-19 03:07:10

15
class FileLineRead 
    File.open("file_line_read.txt") do |file| 
    file.each do |line| 
     phone_number = line.gsub(/\n/,'') 
     user = User.find_by_phone_number(line) 
     user.destroy unless user.nil? 
    end 
    end 
end 
  1. 打開文件
  2. 讀線
  3. DB選擇
  4. 數據庫更新