How to run application on linux in the background but leave possibility to interact with it?

356 views Asked by At

Requirements:

  • I want to run my application on linux in the background (at startup of course).

  • I want to be able to call start/stop/restart commands directly from console (it have to be simple just like for /etc/init.d - just call simple command directly from console).

  • I want to be able to call status - and I want that this command will somehow get the actual status of application returned by itself. I thought that I can call some method which returns String or just use stdin to send command but when I do noup .. &, or start-stop-daemon, then the stdin is detached. Is there a simple way to attach stdin back to the application (I've seen that I can create a pipe, but this is pretty complitated). Or what is the best way to communicate with application after it is started as a daemon (I can make a socket and connect through telnet for example, but I am looking for simpler solution and possibility to do it directly from console, without starting telnet first)? Ideally it will be great to get the possibility to send any command, but simple status will be sufficient (but again - it have to communicate with the application to get that status somnehow)

I have found many different answers. Some of them says to simply use nohup and &, and some others says that nohup and & is old fashion. Some answers says to use start-stop-daemon or JSvc (for java). But it seems that none of them will suffice this 3 requirements from me.

So... What are the simplest possibilities for all of 3 requirements to be met?

PS. I don't want to use screen. The application must be run as a linux daemon.

PPS. Application is written in Java but I am looking for generic soluction which is not limited to java.

1

There are 1 answers

3
Nikolay On BEST ANSWER

You should create a command line tool for communicate with a daemon in way you need. The tool itself can use TCP/IP or named pipes.

And then use cli-tool start|stop|restart|status from console.

If you need to start a daemon at startup sequence (before user login) you have to deal with init system (init.d, systemd, OpenRC, etc...).

Dragons be here:

  1. Be sure that init doesn't restart your daemon after manual stop via cli.

  2. Command line tool itself runs with unprivileged user rights, so restart may be hard if first startup script use superuser rights or application-specific user and, especially in case deep init integration, you might have to use sudo cli-tool start.

To avoid this one possible solution is to make wrapper daemon, that runs forever via init and control the underlying application (start-stop) with proper rights.

Cons: Develop two additional tools for a daemon.

Pros: Wrapper daemon can operate as a circuit breaker between superuser/specific user and userspace.