あなたは一度にいくつかのことをしようとしています。私は、あるステップから次のステップに移行する前に体系的にテストしなかったと思います。
まず私たちはあなたのコードをクリーンアップするつもりだ:
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をキャプチャします。 あなたが読む予定のファイルと同じファイルに書き込むと、空のファイルが読み込まれます。
これでアプリを稼働させるには十分です。
私はそれを言うことを憎むが、このアプリケーション全体での間違ったことがたくさんあります。あなたは何をしたいか言い換えることができますか?開いているファイルを読むことは、あなたがやっていることでもなく、それは意味をなさないので、あなたの目標を注意深く説明することはおそらく、そこに着くために必要なステップを理解するのに役立ちます。 –
私の目標は、スクリプト(出力と発生したエラー)を記録することです。スクリプトの最後に、このログを電子メールで私に送信します。 – Carmen