Ok, estás tratando de hacer varias cosas a la vez, y sospecho que no has probado sistemáticamente antes de pasar de un paso al siguiente.
En primer lugar vamos a limpiar su código:
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"
se puede sustituir por:
puts "Start"
puts File.read("./test.log")
puts "End"
Es así de simple; No hay necesidad de un método o algo complicado ... todavía.
Tenga en cuenta que para facilitar las pruebas estoy trabajando con un archivo en el directorio actual. Para poner un poco de contenido en ella, simplemente voy a hacer:
echo "foo" > ./test.log
Ejecutar el código de prueba me da ...
Greg:Desktop greg$ ruby test.rb
Start
foo
End
así que sé que el código es la lectura y la impresión correctamente.
Ahora podemos probar lo que iría en el crontab, antes de que nos ocupamos de su locura:
Greg:Desktop greg$ ruby test.rb > ./test.log
Greg:Desktop greg$
Hmm. Ninguna salida. Algo está roto con eso. Sabíamos que había contenido en el archivo anteriormente, entonces, ¿qué pasó?
Greg:Desktop greg$ cat ./test.log
Start
End
Cat'ing el archivo de muestra que tiene el "Inicio" y "Fin" salida del código, pero la parte que debería haber leído y salida es ahora falta.
Lo que sucede es que el shell truncó "test.log" justo antes de pasar el control a Ruby, que luego abrió y ejecutó el código, que abrió el archivo ahora vacío para imprimirlo. En otras palabras, le está pidiendo al shell que lo trunque (vacío) justo antes de leerlo.
La solución es leer desde un archivo diferente al que va a escribir, si está intentando hacer algo con el contenido del mismo. Si no estás tratando de hacer algo con su contenido, no tiene sentido leerlo con Ruby solo para escribirlo en un archivo diferente: tenemos cp
y/o mv
para hacer esas cosas sin que se involucre Ruby. Por lo tanto, esto tiene más sentido si vamos a hacer algo con el contenido:
ruby test.rb > ./test.log.out
Voy a restablecer el contenido del archivo usando echo "foo" > ./test.log
y cat'ing se mostró 'foo', así que estoy listo para intentar la prueba de redireccionamiento de nuevo:
Greg:Desktop greg$ ruby test.rb > ./test.log.out
Greg:Desktop greg$ cat test.log.out
Start
foo
End
Esa vez funcionó. Volver a intentarlo tiene el mismo resultado, por lo que no mostraré los resultados aquí.
Si va a enviar el archivo por correo electrónico, puede agregar ese código en este momento. Sustitución de la puts
en la línea puts File.read('./test.log')
con una asignación a una variable almacenará el contenido del archivo:
contents = File.read('./test.log')
continuación, puede utilizar contents
como el cuerpo de un correo electrónico. (Y, en lugar de utilizar Ruby para todo esto, probablemente lo haría usando mail
o mailx
o canalizándolo directamente a sendmail, usando la línea de comandos y el shell, pero esa es su llamada).
En este punto las cosas están en una buena posición para agregar el comando a crontab, usando el mismo comando que se usa en la línea de comandos. Debido a que se está ejecutando en cron, y pueden ocurrir errores que quisiéramos saber, agregaremos el redireccionamiento 2>&1
para capturar STDERR también, tal como lo hizo antes. Solo recuerda que puedes NOT escribir en el mismo archivo desde el que vas a leer o tendrás un archivo vacío para leer.
Eso es suficiente para que tu aplicación funcione.
me gusta decirlo, pero hay un montón de cosas mal con toda esta aplicación. ¿Puedes reformular lo que quieres hacer? Leer un archivo abierto no es lo que estás haciendo ni tiene mucho sentido, por lo que explicar tu objetivo con cuidado probablemente te ayude a comprender los pasos necesarios para llegar allí. –
Mi objetivo es registrar el script (su resultado y cualquier error que ocurra) y al final del script, quiero que me envíe este registro por correo electrónico. – Carmen