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

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

Acabo de ejecutar un trabajo (supongamos foo.sh).

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

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

Respuesta1

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

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

pgrep foo.sh

Entonces podrías usar gdbpara adjuntar a ese proceso.

gdb -p <PID>

Luego gdbcambia dónde escribe este programa.

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

luego te desconectas del proceso y salesgdb

detach
quit

una pequeña explicación

  • 577es equivalente aO_CREAT|O_WRONLY|O_TRUNC
  • 420es equivalente aS_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 a openal descriptor de archivo 1(que es stdout)
  • La segunda llamada a dup2duplica el descriptor del archivo 1( 2que es stderr)

información relacionada