Writing to stdin of background process

Solution 1:

You could start you server with a named pipe (fifo) as its input:

mkfifo /tmp/srv-input
cat > /tmp/srv-input &
echo $! > /tmp/srv-input-cat-pid
cat /tmp/srv-input | myserver &

The cat > /tmp/srv-input & is important to avoid your server to receive a EOF. At least one process must have the fifo opened in writing so your server does not receive a EOF. The PID of this command is saved in the /tmp/srv-input-cat-pid file for latter kill.

In your case where you've already started your server, you have to use a debugger such as gdb to attach to your process to redirect its stdin to the fifo:

gdb -p PID
call close(0)
call open(0, "/tmp/srv-input", 0600)

And then do something like bellow to send input to your server (in another terminal window if necessary):

echo "command" > /tmp/srv-input

To send a EOF to your server, you need to kill the cat > /tmp/srv-input process which PID has been saved in the /tmp/srv-input-cat-pid file.

In the case of GDB, just quit GDB and EOF will be sent.

Solution 2:

You could try writing to it's /proc pid directory. Say your daemons' pid is 2000, try writing to /proc/2000/fd/0


Solution 3:

Same as above, but 'cat' did not work for me. The file got EOF and ended after sending one command.

This worked for me:

#!/bin/bash

mkfifo /tmp/srv-input
tail -f /tmp/srv-input | myserver &