The following alternatives may be used to run a Java program as a daemon on Linux:
- Use the Java Service Wrapper.
- Use the Apache Jakarta Commons Daemon package (Jsvc).
- Use a shell script.
This article describes how to use a shell script. The disadvantage of the Java Wrapper and the Commons Daemon package is that they both make use of C programs. These C programs have to be compiled (or a matching binary distribution has to be found) and have to be compatible with the operating system and the installed Java runtime environment. A shell script, on the other hand, is easier to adapt to changing OS and Java environments.
The shell script (javaDaemonTest.sh) provides the following functionality:
- Start/stop the Java daemon process, according to the Linux system init script convention.
- Run the Java daemon as a different (non-root) Linux user.
- Log error messages and redirect StdOut/StdErr output into a log file.
- Install/uninstall the daemon as a Linux service. (The "install" procedure installs the script in /etc/init.d, enables the service in the configured default runlevels, creates the "rc" command (symlink) and creates the Linux user (as a system account) and group if necessary).
Example of how to install the JavaDaemonTest service (SUSE Linux, execute as root): (Tested with SUSE/openSUSE 9.1, 10.0 and 11.1)
mkdir -p /var/local/javaDaemonTest cd /var/local/javaDaemonTest wget http://guohai.org/code/201410/javaDaemonTest.tar.gz tar -xzf javaDaemonTest.tar.gz javac JavaDaemonTest.java ./javaDaemonTest.sh install rcjavaDaemonTest start rcjavaDaemonTest status ... wait a bit to let the test program write some output lines into the log file ... rcjavaDaemonTest stop rcjavaDaemonTest status less /var/log/javaDaemonTest.log
rcjavaDaemonTest stop rcjavaDaemonTest uninstall rm -R /var/local/javaDaemonTest rm /var/log/javaDaemonTest.log
javaDaemonTest.sh start/stop shell script (for SUSE Linux)
JavaDaemonTest.java a dummy Java daemon program, used for testing the script
javaDaemonTest.tar.gz the whole package as a tar/gzip file