How to change the output redirection of a running process?

15,107

Solution 1

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.

Solution 2

That's not possible. Or at least not easy. You might have some luck attaching gdb to the process and fiddling with it in gdb, but that can lead to crashes just as easily as success.

Solution 3

You should use reptyr to attach another process to your new current terminal. For example: install and use GNU's screen utility, and in it launch the reptyr command to "fetch" the other process's redirections (and controlling terminal) and attach them to the new current terminal (the screen process, if you launched reptyr from screen). The advantage of doing this from a screen session is that, once under screen, it will then be easy to disconnect and reconnect to it (for example, closing your local session, going home, and reopening it).

Share:
15,107
gertvdijk
Author by

gertvdijk

FOSS enthousiast, Developer, Debian GNU/Linux (and Ubuntu) user, DevOps with Ansible/Pupppet powers, Coding in C/C++/Python. Keywords: Linux, KVM/Libvirt, Kubernetes, Ansible, Docker, Python, a bit of C/C++/Kotlin, Debian, Ubuntu, Apache, Kopano, Postfix, MySQL, PostgreSQL, Kafka, security, KDE, SSL/TLS. Every now and then I'll write an article on those topics my blog. Other sites I'm active on: Launchpad, Tweakers.net, Twitter, LinkedIn

Updated on September 18, 2022

Comments

  • gertvdijk
    gertvdijk over 1 year

    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
    
  • Gilles 'SO- stop being evil'
    Gilles 'SO- stop being evil' over 11 years
  • Dennis Kaarsemaker
    Dennis Kaarsemaker over 11 years
    Feel free to share them, I'll upvote the answer :)
  • Gilles 'SO- stop being evil'
    Gilles 'SO- stop being evil' over 11 years
  • Dennis Kaarsemaker
    Dennis Kaarsemaker over 11 years
    Not quite. All tools linked in the other bug are about attaching to another terminal/screen session. Not about redirecting to another file. Though it's probably not hard to patch reptyr to redirect to a file instead.
  • gertvdijk
    gertvdijk over 11 years
    Thanks for your answer, but it doesn't help me with my case as I am not asking about terminal detach/retach. Please re-read my question and the example in specific.
  • Olivier Dulac
    Olivier Dulac over 11 years
    ah, in that case : read the reptyr code, find out how to modify it to only redirect stdout or stderr. Then run it from another shell that redirects that newly-attached stream to where you want it to go? (or, better, using the reptyr source, do the redirection directly)
  • gertvdijk
    gertvdijk over 11 years
    I've looked a bit into reptyr's source and I agree most with the "not easy" part of the answer. Might take a deeper dive into it some time later.