Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to pass input to a running service or daemon?

Tags:

linux

I want to create a Java console application that runs as a daemon on Linux, I have created the application and the script to run the application as a background daemon. The application runs and waits for command line input.

My question:

Is it possible to pass command line input to a running daemon?

like image 332
Yorbenys Pardo Rodríguez Avatar asked Nov 22 '16 01:11

Yorbenys Pardo Rodríguez


2 Answers

On Linux, all running processes have a special directory under /proc containing information and hooks into the process. Each subdirectory of /proc is the PID of a running process. So if you know the PID of a particular process you can get information about it. E.g.:

$ sleep 100 & ls /proc/$!
...
cmdline
...
cwd
environ
exe
fd
fdinfo
...
status
...

Of note is the fd directory, which contains all the file descriptors associated with the process. 0, 1, and 2 exist for (almost?) all processes, and 0 is the default stdin. So writing to /proc/$PID/fd/0 will write to that process' stdin.

A more robust alternative is to set up a named pipe connected to your process' stdin; then you can write to that pipe and the process will read it without needing to rely on the /proc file system.

See also Writing to stdin of background process on ServerFault.

like image 154
dimo414 Avatar answered Nov 01 '22 08:11

dimo414


The accepted answer above didn't quite work for me, so here's my implementation. For context I'm running a Minecraft server on a Linux daemon managed with systemctl. I wanted to be able to send commands to stdin (StandardInput).

First, use mkfifo /home/user/server_input to create a FIFO file somewhere.

[Service]
ExecStart=/usr/local/bin/minecraft.sh
StandardInput=file:/home/user/server_input

Then, in your daemon *.service file, execute the bash script that runs your server or background program and set the StandardInput directive to the FIFO file we just created. In minecraft.sh, the following is the key command that runs the server and gets input piped into the console of the running service.

tail -f /home/user/server_input| java -Xms1024M -Xmx4096M -jar /path/to/server.jar nogui

Finally, run systemctl start your_daemon_service and to pass input commands simply use:

echo "command" > /home/user/server_input

Creds to the answers given on ServerFault

like image 41
Jake Morfe Avatar answered Nov 01 '22 10:11

Jake Morfe