2010-12-18 4 views
18

현재 열려있는 파일을 읽을 수 있기를 원합니다. test.rb는 출력물을 test.log에 보내고,이 파일을 읽고 전자 메일을 통해 궁극적으로 보낼 수 있기를 원합니다.Ruby에서 열린 파일을 읽는 방법

나는이 사용 크론을 실행하고 있습니다 :

*/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

내가 말을 싫어하지만,이 전체 응용 프로그램 문제 많은 일들이 있습니다. 당신이하고 싶은 말을 바꿀 수 있습니까? 열린 파일을 읽는 것이 당신이하는 일이 아니며 많은 의미를 지니지 않으므로주의 깊게 목표를 설명하면 아마도 거기에 도달하는 데 필요한 단계를 이해하는 데 도움이 될 것입니다. –

+0

내 목표는 스크립트 (출력 및 발생하는 모든 오류)를 기록하는 것이며 스크립트가 끝날 때 이메일로이 로그를 보내주기를 바랍니다. – Carmen

답변

4

cron 작업에서는 Ruby 스크립트에서 이미 읽은 후 test.log (리디렉션을 통해)을 열었습니다.

왜 Ruby에서 읽기 및 쓰기를 모두 수행하지 않습니까?

+0

나는이 일에 정말로 초보자이므로 오래 기다려주십시오. 하지만 루비에서 읽고 쓰는 것에 대해 제안한 것을 어떻게 할 수 있습니까? – Carmen

3

내가보기에 문제는 이미 Slomojo가 해결했습니다. 난 단지 추가 할 것입니다 :
읽고 그냥 루비 텍스트 파일을 인쇄 :

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

그래서,이 시도했지만 여전히 동일한 출력지고있다. 출력이 버퍼링되어 있기 때문에 파일을 읽을 때 로그 파일에 아무것도 남아 있지 않으므로? – Carmen

+0

@ 카르멘, 저는 Windows 숙달입니다, 죄송합니다, 귀하의 cron에 대해 아무것도 모르겠습니다.) – Nakilon

+0

@ 카르멘, 버퍼링이 필요 없습니다. OS가 응용 프로그램을 시작하기 직전에 발생하는 STDOUT 및 STDERR 리디렉션이 설정되면 cronjob이 실행되고 파일이 OS에 의해 잘립니다. –

3

그것은 권한 문제 일 수도 있고 파일이 존재하지 않을 수 있습니다.

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

위의 내용은 test 파일을 읽습니다. 파일이 현재 디렉토리에있는 경우

+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 

그래서 코드가 읽고 인쇄 제대로 알고.

이제 우리는 우리의 광기를 처리하기 전에,은 crontab에 갈 것입니다 무엇을 테스트 할 수 있습니다

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

음을. 출력 없음. 뭔가가 망가졌습니다. 이전에 파일에 내용이 있음을 알았습니까?

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

End 

파일을 Cat'ing 것은 '시작'과 코드의 "끝"출력하지만, 읽은해야하며, 출력이 이제 누락 된 부분이 보여줍니다.

셸이 제어를 통과하기 직전에 "test.log"를 잘라내어 코드를 열고 실행했는데, 이제 빈 파일을 열어 인쇄했습니다. 다른 말로하면, 쉘을 읽으기 직전에 쉘이 그것을 자르도록 요청하는 것입니다.

수정 내용은 내용을보고 무언가를하려고 할 때 쓸 파일과 다른 파일에서 읽는 것입니다. 루비가 내용을 가지고 뭔가를하려고하지 않는다면 루비와 함께 다른 파일에 글을 쓸 필요가 없습니다. 우리는 루비가 관련되어있는 것을 위해 cp 및/또는 mv을 사용합니다. 그래서 우리는 내용으로 뭔가 할 거라면이 더 의미 : 나는 echo "foo" > ./test.log를 사용하여 파일의 내용을 다시 설정합니다

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

을하고 'foo는'보여 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을 사용하거나 명령 행과 쉘을 사용하여 sendmail에 직접 파이프 할 것입니다.)

이 시점에서 명령 줄에 사용 된 명령과 동일한 명령을 사용하여 crontab에 명령을 추가하는 것이 좋습니다. 실행중인 cron이기 때문에 이전에했던 것처럼 STDERR을 캡처하기 위해 2>&1 리디렉션을 추가 할 수 있습니다. 아니요 같은 파일에 쓰거나 읽을 빈 파일이 있어야한다는 것을 기억하십시오.

앱을 작동시키기에 충분합니다.

+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 업데이트