Need help with shutdowning a java process

Yevgen Krapiva ykrapiva at gmail.com
Wed Jan 6 06:58:09 UTC 2010


Thanks, I've already read the article but still missing some things.
So, I've followed your advice:

Now rc script looks like:

pidfile="/var/run/${name}.pid"
command="/usr/sbin/daemon"
command_args="-p ${pidfile} $runcmd"
command_interpreter="/usr/local/diablo-jdk1.6.0/bin/java"
#flags="-p ${pidfile} $runcmd"

Testing script:

root at etc/rc.d #./openjsip-location-service onestart
./openjsip-location-service: WARNING: no shebang line
in /usr/sbin/daemon
Starting openjsip_location_service.
2010-01-06 06:34:13,813  INFO  - Location Service started...

root at etc/rc.d #./openjsip-location-service onestatus
./openjsip-location-service: WARNING: no shebang line
in /usr/sbin/daemon
openjsip_location_service is not running.

root at etc/rc.d #ps wwaux | grep openjsip
root       19814  0.0  0.7 894148 22688  ??  Is    8:34AM
0:00.48 /usr/local/diablo-jdk1.6.0/bin/java
-cp :/usr/local/share/openjsip/lib/jain-sdp-1.0.115.jar:/usr/local/share/openjsip/lib/jain-sip-api-1.2.jar:/usr/local/share/openjsip/lib/jain-sip-ri-1.2.115.jar:/usr/local/share/openjsip/lib/jain-sip-sdp-1.2.115.jar:/usr/local/share/openjsip/lib/log4j-1.2.15.jar:/usr/local/share/openjsip/lib/openjsip-0.0.5.jar:/usr/local/share/openjsip/lib/openjsip-remote-0.0.5.jar:/usr/local/share/openjsip/lib/snmp.jar -Djava.security.policy=conf/policy.all -Djava.rmi.server.codebase=file:///usr/local/share/openjsip/lib/openjsip-remote-0.0.5.jar file:///usr/local/share/openjsip/lib/jain-sip-api-1.2.jar openjsip.locationservice.LocationService conf/location-service.properties

What means "no shebang line" ?

Ok, when I comment command_interpreter line, no warnings are issued.
But checking status is also not working. Running sh -x
openjsip-location-service showed that:
 + _pidfile=/var/run/openjsip_location_service.pid
 + _procname=/usr/sbin/daemon
 + _interpreter=''

So, procname is incorrect. No daemon in processes, there is java only.
So, I'm trying to set correct process name:

# Subvert the check_pidfile procname check.
if [ -f $pidfile ]; then
  read rc_pid junk < $pidfile
  if [ ! -z "$rc_pid" ]; then
    procname=`ps -o command= $rc_pid`
    echo rc_pid=$rc_pid
    echo procname=$procname
  fi
fi

Testing:

root at etc/rc.d #./openjsip-location-service onestatus
rc_pid=24821
procname=/usr/local/diablo-jdk1.6.0/bin/java
-cp :/usr/local/share/openjsip/lib/jain-sdp-1.0.115.jar:/usr/local/share/openjsip/lib/jain-sip-api-1.2.jar:/usr/local/share/openjsip/lib/jai
./openjsip-location-service: WARNING: no shebang line
in /usr/local/diablo-jdk1.6.0/bin/java
openjsip_location_service is not running.

Running with sh -x showed that:

+ _pidfile=/var/run/openjsip_location_service.pid
+ _procname=/usr/local/diablo-jdk1.6.0/bin/java
+ _interpreter=-cp

May be I should simply override stop_cmd and kill process manually using
PID only ?

On Tue, 2010-01-05 at 09:56 -0800, Doug Barton wrote:

> To start with, you should really read the article at
> http://www.freebsd.org/doc/en_US.ISO8859-1/books/porters-handbook/rc-scripts.html,
> I think it would help you get a picture of how some of this should
> look. Some more comments below.
> 
> Yevgen Krapiva wrote:
> > Hi all, 
> > 
> > I have the following rc script:
> > 
> > ..
> > name="openjsip_location_service"
> > ..
> > # Execution command
> > runcmd="java -cp $CLASSPATH -Djava.security.policy=conf/policy.all
> > -Djava.rmi.server.codebase=\"file://$OPENJSIP_REMOTE_LIB
> > file://$JAIN_SIP_API_LIB\" openjsip.locationservice.LocationService
> > conf/location-service.properties"
> > 
> > pidfile="/var/run/${name}.pid"
> > command="/usr/sbin/daemon"
> 
> > flags="-p ${pidfile} $runcmd"
> 
> Rather than having 2 different variables, you should combine your
> "flags" and "runcmd" variables into command_args, which is the usual
> way to accomplish what you seem to be trying to accomplish.
> 
> > # When I run java from /usr/local/bin I run javavm indeed (convenient
> > wrapper for switching Java VMs).
> > # So I need to get the correct processname from output of 'ps' command
> > 
> > # Subvert the check_pidfile procname check.
> 
> Yeah, let's not subvert stuff. :)  I'm not really familiar with java,
> but what I think you need to do is to set
> "command_interpreter=/usr/local/diablo-jdk1.6.0/bin/java" which should
> give rc.subr the information it needs to find your process. If that
> doesn't work, do 'ps -auxww | grep openjsip' and show us the results.
> 
> 
> Doug
> 


More information about the freebsd-rc mailing list