I have detached a process from my terminal, like this:
$ process &
That terminal is now long closed, but process
is still running, and I want to send some commands to that process's stdin. Is that possible?
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. It only takes a minute to sign up.
Sign up to join this communityI have detached a process from my terminal, like this:
$ process &
That terminal is now long closed, but process
is still running, and I want to send some commands to that process's stdin. Is that possible?
Yes, it is. First, create a pipe:
mkfifo /tmp/fifo
.
Use gdb to attach to the process:
gdb -p PID
Then close stdin: call close (0)
; and open it again: call open ("/tmp/fifo", 0600)
Finally, write away (from a different terminal, as gdb will probably hang):
echo blah > /tmp/fifo
touch /tmp/thefile
. Stdout is 1, so call close (1)
; also, use the correct permissions for writing: call open ("/tmp/thefile", 0400)
. The echo…
is, of course, not needed.
– Ansgar Esztermann
Aug 26 '14 at 11:25
call open("/tmp/fifo", 0600)
. any help would be greatly appreciated
– archer
Dec 22 '18 at 13:34
When original terminal is no longer accessible...
reptyr
might be what you want, see https://serverfault.com/a/284795/187998
Quote from there:
Have a look at reptyr, which does exactly that. The github page has all the information.reptyr - A tool for "re-ptying" programs.
reptyr is a utility for taking an existing running program and attaching it to a new terminal. Started a long-running process over ssh, but have to leave and don't want to interrupt it? Just start a screen, use reptyr to grab it, and then kill the ssh session and head on home.
USAGE
reptyr PID
"reptyr PID" will grab the process with id PID and attach it to your current terminal.
After attaching, the process will take input from and write output to the new terminal, including ^C and ^Z. (Unfortunately, if you background it, you will still have to run "bg" or "fg" in the old terminal. This is likely impossible to fix in a reasonable way without patching your shell.)
sudo yum install -y reptyr
. This worked great for me to take over a vi
editing session I lost when my SSH connection dropped (just had to press ^L
after taking it back over to see all my changes and continue editing).
– Gary
Jan 29 '20 at 1:29
dpkg-deb --extract reptyr_0.6.2-1.2_amd64.deb reptyr && reptyr/usr/bin/reptyr $PID_OF_WANTED_PROCESS
– miigotu
Apr 3 '20 at 5:59
reptyr
... was able to save a file from a detached VI session.
– TripeHound
Apr 13 '20 at 12:57
I am quite sure you can not.
Check using ps x
. If a process has a ?
as controlling tty, you can not send input to it any more.
9942 ? S 0:00 tail -F /var/log/messages
9947 pts/1 S 0:00 tail -F /var/log/messages
In this example, you can send input to 9947
doing something like echo "test" > /dev/pts/1
. The other process (9942
) is not reachable.
Next time, you could use screen or tmux to avoid this situation.
root
you could even do this to other user's processes.
– dmckee --- ex-moderator kitten
Feb 16 '12 at 21:30
echo "test" > /dev/pts/1
won't send input to process 9947
- it will output the word "test" on that process's terminal.
– psmears
Nov 20 '14 at 22:59
EDIT : As Stephane Gimenez said, it's not that simple. It's only allowing you to print to a different terminal.
You can try to write to this process using /proc. It should be located in /proc/pid/fd/0, so a simple :
echo "hello" > /proc/PID/fd/0
should do it. I have not tried it, but it should work, as long as this process still has a valid stdin file descriptor. You can check it with ls -l
on /proc/pid/fd/.
See nohup for more details about how to keep processes running.
echo
ing something to the terminal device will just print what you wrote on the terminal, it will not be transmitted to the process.
– Stéphane Gimenez
Feb 16 '12 at 16:16
Just ending the command line with &
will not completely detach the process, it will just run it in the background. (With zsh
you can use &!
to actually detach it, otherwise you have do disown
it later).
When a process runs in the background, it won't receive input from its controlling terminal anymore. But you can send it back into the foreground with fg
and then it will read input again.
Otherwise, it's not possible to externally change its filedescriptors (including stdin) or to reattach a lost controlling terminal… unless you use debugging tools (see Ansgar's answer, or have a look at the retty
command).
>>/dev/stderr
, otherwise, when I close the terminal, the "disowned" process will end too.. I never really understood this tho..
– Aquarius Power
Nov 20 '15 at 5:08
retty
,neercs
, etc. and see also serverfault.com/questions/24425, serverfault.com/questions/115998 – Gilles 'SO- stop being evil' Feb 16 '12 at 21:39