inetd
to Launch
rmid
On the Solaris Operating System (Solaris OS), the Internet
services daemon inetd
provides an alternative to
starting up services at system boot time. This daemon, a server
process for Internet standard services, can be configured to
start services on demand. For details on the Internet services
daemon, see the Solaris OS inetd(1M)
man page.
As of the J2SE(tm) 5.0 release, inetd
can be
configured to start the Java RMI activation daemon
rmid
on demand. In this case, rmid
does
not need to be started up at boot time or started up manually.
Instead, rmid
will be started when a client attempts
to connect to it, such as in order to activate an object.
Note: If restartable services are registered with
rmid
, rmid
should be started at system
boot type (not by inetd
) so that the restartable
services are always running when the system is up.
To configure inetd
to launch rmid
,
you will need to add an entry to each of two configuration files
that inetd
uses, /etc/inetd.conf
and
/etc/services
. Editing these files requires root
access to the machine that rmid
will run on.
After inetd
has been reconfigured, you should
test your configuration to make sure that it works properly.
This tutorial has the following steps:
/etc/inetd.conf
/etc/services
inetd
to read its new
configuration/etc/inetd.conf
The /etc/inetd.conf
configuration file contains
entries for the services to be launched when inetd
receives a request over a socket. For details on the format of
this configuration file see the Solaris OS
inetd.conf(4)
man page.
To configure inetd
to launch rmid
,
add the following entry to the /etc/inetd.conf
configuration file (requires root access to the machine):
rmid stream tcp wait nobody jreHome/bin/rmid \ rmid -log logDir/rmid.log rmidOptionswhere jreHome is a path to the installed JRE, logDir is the directory for the log file, and rmidOptions is any other options for
rmid
(for example, property initializations). When
rmid
is launched by inetd
the
-log
option must be specified, and the
-port
option must not be specified, since the
port is derived from the /etc/services
configuration.
If rmid
needs to be run as a user other than
nobody
, replace nobody
above with the
user ID under which rmid
should run.
/etc/services
Next, rmid
needs to be listed as a service in the
/etc/services
configuration file. For details on the
format of this configuration file see the Solaris OS
services(4)
man page.
To list rmid
as a service, add the following
entry to the /etc/services
configuration file
(requires root access to the machine):
rmid port/tcp
where port is the port number for the
ActivationSystem
and the Activator
remote objects that rmid
exports. This port number
is typically 1098, but another port number can be used as long as
the clients and activatable services define the system property
java.rmi.activation.port
to that port.
inetd
to read its new
configurationNow that the configuration has been modified,
inetd
needs to read the new configuration so that it
can listen on the appropriate ports for the services that are
configured.
But first, it is important to make sure that rmid
is not already running. To do this, run the following
command:
% ps -ef | grep rmid
If the above command does not print out the information for a
running rmid
process, then rmid
is not
running. If it does, then you will need to shut down
rmid
first before continuing.
Next, inetd
needs to read its new configuration.
To force inetd
to reread its configuration, the
running inetd
process must be sent a hangup signal.
First, find the process ID for the running inetd
process by running the following command:
% ps -ef | grep inetd
which will print out something like this:
root 171 1 0 Sep 30 ? 0:02 /usr/sbin/inetd -s
In this example, the process ID for inetd
is
171
. Now, the inetd
process can be sent
a hangup signal by running the following command and supplying
the process ID (requires root access):
% kill -HUP 171
Now, inetd
is all set to launch rmid
when a program attempts to connect to the port configured
above.
To test that inetd
is configured properly, you
can run a simple program that looks up the
ActivationSystem
which will, in turn, cause
inetd
to launch rmid
if the
configuration is correct.
The following is a simple program to look up the
ActivationSystem
on a port, supplied as the value of
the java.rmi.activation.port
system property:
package example.inetd; import java.rmi.activation.ActivationSystem; import java.rmi.activation.ActivationGroup; public class GetActivationSystem { public static void main(String[] args) throws Exception { ActivationSystem system = ActivationGroup.getSystem(); System.err.println("ActivationSystem = " + system); } }
Compile and run this program as follows:
% javac -d classDir GetActivationSystem.java % java -classpath classDir -Djava.rmi.activation.port=port example.inetd.GetActivationSystemwhere classDir is the class path for this example class, and port is the port for the
ActivationSystem
configured for
rmid
in the /etc/services
file.
If the program prints out the ActivationSystem
successfully then rmid
was launched by
inetd
.
If the program either hangs or prints an exception trace,
check the output file produced by rmid
. When
rmid
is launched by inetd
, any output
written to System.err
is written to a file located
in the directory specified by the property
java.io.tmpdir
, typically /var/tmp
on
the Solaris OS. The output file is prefixed with "rmid-err" and
has the suffix of ".tmp". The file name also contains other
characters (typically numbers) in between to keep the file name
unique.
If rmid
starts up successfully from
inetd
, the output file should contain text similar
to the following (with no warning or error messages):
Tue Sep 30 13:07:38 EDT 2003 rmid startup with inherited channel: sun.nio.ch.ServerSocketChannelImpl[/192.0.2.120:1098]
If the file does not exist, the above text is not in the file,
or additional error output is in the file, then recheck the
configuration. Upon changing the inetd
configuration, remember to send inetd
a hangup
signal so that it rereads its altered configuration, and remember
to terminate any rmid
process started from the
previous attempt before continuing.