¿Redirigir stdout / stderr de un trabajo en segundo plano desde la consola a un archivo de registro?


9

Acabo de ejecutar un trabajo (supongo que foo.sh).

./foo.sh
[Press Ctrl-Z to stop]
bg  # enter background

Y genera salida a stdout y stderr. ¿Hay algún método para redirigir a stdout y stderr a otro archivo en lugar de la pantalla actual?


Tráigalo a FG, redirija la salida y envíela de vuelta a BG.
alfasin

Respuestas:


16

Aparentemente leí mal su pregunta la primera vez, así que aquí está mi respuesta actualizada:

Después de enviar su programa a un segundo plano, primero debe encontrar su PID

pgrep foo.sh

Entonces podría usar gdbpara adjuntar a ese proceso

gdb -p <PID>

En gdbdespués cambia en este programa escribe en

p dup2(open("/path/to/file",577, 420), 1)
p dup2(1, 2)

luego te desconectas del proceso y sales gdb

detach
quit

Una pequeña explicacion

  • 577 es equivalente a O_CREAT|O_WRONLY|O_TRUNC
  • 420 es equivalente a S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH
  • Entonces, la llamada a openabre el archivo y lo trunca a 0 bytes si existe o crea uno nuevo con los permisos de archivo correctos si no existe
  • La primera llamada a dup2duplica el descriptor de archivo devuelto por la llamada al opendescriptor de archivo 1(que es stdout)
  • La segunda llamada a dup2duplica el descriptor de archivo 1a 2(que es stderr)

1
-1. No responde la pregunta que se hizo. Específicamente, cómo redirigir la salida de un trabajo en segundo plano .
Steven Monday

1
Sí, lo siento, leído mal la pregunta y corregido esto ahora
s.wagner

¡Bueno! Voto negativo retraído.
Steven lunes
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.