2010-12-18 9 views
18

現在開いているファイルを読みたいと思っています。 test.rbは出力をtest.logに送信していますが、これは読めるようにし、最終的には電子メールで送信します。Rubyで開いているファイルを読むには

私は、この使用してcronを実行している:私はtest.rbでこのような何かを持っている

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

を:私はこのコードを実行すると

#!/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

私はそれを言うことを憎むが、このアプリケーション全体での間違ったことがたくさんあります。あなたは何をしたいか言い換えることができますか?開いているファイルを読むことは、あなたがやっていることでもなく、それは意味をなさないので、あなたの目標を注意深く説明することはおそらく、そこに着くために必要なステップを理解するのに役立ちます。 –

+0

私の目標は、スクリプト(出力と発生したエラー)を記録することです。スクリプトの最後に、このログを電子メールで私に送信します。 – Carmen

答えて

4

cronジョブでは、Rubyスクリプトで読み取る前に、既にオープンしてtest.log(リダイレクト経由で)をクリアしています。

なぜRubyで読み書きをしないのですか?

+0

私は本当にこれについての初心者ですので、忍耐力を持ってください。しかし、Rubyで読んだり、書き込んだりするときに、どうやったらいいですか? – Carmen

3

私が見る通り、問題はすでにSlomojoによって解決されています。私は追加します:
をRubyでテキストファイルを読み込んで印刷するには、ちょうど:

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

だから私はこれを試しましたが、私はまだ同じ出力を得ています。それはファイルが読み込まれているときにログファイルに何も残らないように出力がバッファリングされているためですか? – Carmen

+0

@カルメン、私はWindowsに熟達しています、ごめんなさい、あなたのcronについては何も知らない) – Nakilon

+0

@カルメン、バッファリングは関係ありません。 OSがアプリケーションを起動する直前に発生するSTDOUTおよびSTDERRリダイレクションが設定されている場合、cronジョブが起動し、ファイルはOSによって切り捨てられます。 –

3

これは、アクセス許可の問題であってもよいし、ファイルが存在しない場合があります。

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

上記のテストでは、ファイルが読み込まれます。ファイルが現在のディレクトリに存在する場合

+0

権限の問題またはファイルの存在の問題ではありません。これはタイミングの問題で、シェルはファイルを読み込む直前にファイルを切り捨てます。 –

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 

ので、私は、コードを読んで、正しく印刷されて知っています。

Greg:Desktop greg$ ruby test.rb > ./test.log 
Greg:Desktop greg$ 

うーん:

今、私たちは、私たちはその狂気に対処する前に、crontabファイルに行くだろうかをテストすることができます。出力はありません。それで何かが壊れています。以前はファイルにコンテンツがあることが分かっていたので、どうしたのですか?ファイルをCat'ing

Greg:Desktop greg$ cat ./test.log 
Start 

End 

は、それが「開始」とコードの出力が、読まれている必要があり、出力が今欠けている部分を「終了」を持って示しています。

何が起こったかは、シェルがRubyに制御を渡す直前に "test.log"を切り捨て、次にコードを開いて実行して、空のファイルを開いてそれを印刷したことです。言い換えれば、あなたはそれを読む直前にシェルに(切り捨てて)切り捨てるように要求しています。

修正内容は、内容を使って何かをしようとしていると、書き込み先のファイルとは異なるファイルから読み込むことです。その内容を使って何かをしようとしていないなら、それを別のファイルに書き込むためにRubyで読むことには意味がありません。Rubyが関わっているのであれば、それらのことを行うにはcpおよび/またはmvがあります。私たちは内容で何かをやろうとしているのであれば、これはより理にかなって:私はecho "foo" > ./test.logを使用してファイルの内容をリセットします

ruby test.rb > ./test.log.out 

、およびそれをcat'ing「foo」を示したので、私は準備ができていますリダイレクトテストをもう一度試してみてください。

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を使用するか、コマンドラインとシェルを使用してsendmailに直接パイプしますが、それはあなたの呼び出しです。)

この時点では、コマンドラインで使用されているのと同じコマンドを使用して、crontabにコマンドを追加するのに適しています。それはcronで実行されており、エラーが発生する可能性があるため、以前と同じように2>&1リダイレクトを追加してSTDERRをキャプチャします。 あなたが読む予定のファイルと同じファイルに書き込むと、空のファイルが読み込まれます。

これでアプリを稼働させるには十分です。

+1

肯定的な解説! –

+0

私はそれを長らく残しておきます。 :-) –

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. DB更新
関連する問題