2012-04-04 13 views
5

Tenemos guiones de seguir a la naturaleza (en cron)¿Hay alguna manera en un script de shell para averiguar dónde se redirige su resultado?

someScript.sh > /tmp/cronlog/somescript.$(date +%Y%m%d).log 2>&1

Ahora hay una manera por la cual en la someScript.sh puedo averiguar lo que el archivo de salida ha ido a?

La secuencia de comandos envía un correo electrónico con un resumen. Al mismo tiempo, me gustaría mencionar que se pueden encontrar detalles en el archivo de salida, con el correo electrónico.

Soy consciente de la construcción if [ -t 1 ] para detectar stdout, etc. pero cómo obtener el nombre del archivo de salida? Tenga en cuenta que quiero que esto sea genérico para que alguien pueda cambiar el archivo de salida en cron y el script no necesita ser modificado.

+1

mover la parte de correo electrónico del proceso a una El script envoltorio que llama a 'someScript.sh', verifica que se ejecutó correctamente y luego envía correos electrónicos apropiadamente elaborados (éxito, advertencia o error). ELSE establece un archivo log var, lo exporta, reemplaza tmp/... arriba con $ logFile, confía en $ {logFile} dentro del script. Buena suerte. – shellter

Respuesta

9

Lo más sencillo que podía pensar es que:

readlink -f /proc/$$/fd/1 

$$ es el PID del guión (dentro de la secuencia de comandos). En la mayoría de los sistemas Unix,/proc/[pid] es el pseudo-directorio que contiene información para el proceso [pid].

/proc/[pid]/fd es un directorio que contiene una lista de enlaces simbólicos para los descriptores de archivos abiertos del proceso. se ingresa fd/0, fd/1 es la salida de la secuencia de comandos, etc.

readlink le proporciona el archivo de destino o tty si no redirige la salida.

Por supuesto, si desea visualizarlo, debe mostrarlo en otro lugar que no sea la salida estándar, o se lo redireccionará. Para depurar, pruebe el error estándar (2).

varios llamamientos para darle los resultados en mi caja (script.sh sólo llama readlink -f/proc/$$/fd/1> & 2)

# ./script.sh 
/dev/pts/0 

# ./script.sh > /var/tmp/foo 
/var/tmp/foo 

# ./script.sh | more 
/proc/12132/fd/pipe:[916212] 
+0

¡Impresionante! Estoy aceptando la respuesta. @huelbois. Deseo que obtengan más votos para esto. –

+0

Estoy comentando porque Linux estaba ** NO ** en la etiqueta aquí. No tengo '/ proc' en mi Mac. – anubhava

+0

Thanx @ring bearer!No tuve muchas oportunidades de trabajar en Mac, solo 20 días en un proyecto doloroso. Sin embargo, obtienes cosas muy interesantes del/pseudo sistema de archivos proc, vale la pena echarle un vistazo. – huelbois

4

En lugar de tratar de encontrar un hack (y que también depende de la plataforma) es mejor tomar un enfoque ligeramente diferente aquí.

Fije su tarea en el cron como esto:

someScript.sh /tmp/cronlog/somescript.$(date +%Y%m%d).log 

es decir, sin y > o 2>&1 (stdout/stderr arroyos redirecciones) y acaba de pasar un argumento con el logfile nombre deseado.

Ahora dentro someScript.sh redirigir los flujos a su archivo de registro de la siguiente manera:

LOGFILE=$1 
exec &>${LOGFILE} 

Y, finalmente, a continuación, puede mensaje a sus clientes que:

"output details could be found in ${LOGFILE}" 
Cuestiones relacionadas