Linux Bash – How to Change Output Redirection of a Running Process

bashio-redirectionlinux

I know how to redirect output and how to suppress them in bash. Now, suppose I accidentally forgot to append the output redirection part to the command (e.g. 2>&1 or > /tmp/mystdout) and my background process is already running for a while, can I still change to where stdout and stderr are being written to? I really would like not to kill and restart the application.

To be more specific as asked by Gilles in his comment, I would like to fiddle with it in these scenarios in specific:

  • wrong output file
  • forgot to redirect stderr to stdout

or a combination of both

E.g. I have Apache running and I can see the file descriptors:

/proc/8019/fd/0 -> /dev/null
/proc/8019/fd/1 -> /dev/null
/proc/8019/fd/2 -> /var/log/apache2/error.log

Best Answer

You can do it using reredirect (https://github.com/jerome-pouiller/reredirect/).

reredirect -m /dev/null <PID>

You can restore initial output of your process later using something like:

reredirect -N -O <M> -E <N> <PID>

(<M> and <N> are provided by previous launch of reredirect).

reredirect README also explains how to redirect to another command or to redirect only stdout or stderr.

Related Question