Hi, it seems that debian is not using the init script provided by the activemq project.
I downloaded and extracted the current debian script of the activemq package from https://packages.debian.org/jessie/all/activemq/download (see attached file) In 2009 the init script of the activemq distribution was a really bit ugly. I did a rewrite years ago but it was hard to get the new script in a maintained state because the project was really slow in reviewing and accepting patches. In the last weeks i did some further improvements and got some patches to upstream. It´s hard to write and maintain a general init script which can be used on various unix/linux platforms. I really welcome any feedback which helps me to really improve that script. See also: https://issues.apache.org/jira/browse/AMQ-5503 https://github.com/apache/activemq/pull/61 Regards Marc Am 20.04.2015 um 16:31 schrieb James Green: > I'm having a hard time getting a Debian package of ActiveMQ to upgrade. > > It seems that the ActiveMQ init script is told to "stop". JMX is not > configured so this fails, falling back to sending a SIGKILL. > > The trouble is that "kill" only ever returns the result of itself and does > not guarantee that the process being killed was successfully terminated. > Irrespective of this, the ActiveMQ init script always returns "1" to the > caller resulting in the package upgrade failing. > > It's tempting to return the result of the "kill" command but I'm concerned > it's not the correct solution. > > Suggestions? > > Thanks, > > James > -- GPG encryption available: 0x670DCBEC/pool.sks-keyservers.net
#! /bin/sh ### BEGIN INIT INFO # Provides: activemq # Required-Start: $remote_fs # Required-Stop: $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: ActiveMQ instance # Description: Start ActiveMQ instance ### END INIT INFO # Author: Damien Raude-Morvan <draz...@debian.org> # Author: Jonas Genannt <jonas.gena...@capi2name.de> PATH=/sbin:/usr/sbin:/bin:/usr/bin DESC="ActiveMQ instance" NAME=activemq DAEMON=/usr/bin/$NAME SCRIPTNAME=/etc/init.d/`basename $0` DEFAULT=/etc/default/$NAME ACTIVEMQ_JAR=/usr/share/activemq/bin/run.jar ACTIVEMQ_INSTANCES_ENABLED=/etc/activemq/instances-enabled # Load the VERBOSE setting and other rcS variables . /lib/init/vars.sh # Define LSB log_* functions. # Depend on lsb-base (>= 3.2-14) to ensure that this file is present # and status_of_proc is working. . /lib/lsb/init-functions # Whether to start ActiveMQ (as a daemon or not) NO_START=0 ACTIVEMQ_USER=activemq DIETIME=2 # Read configuration variable file if it is present [ -r $DEFAULT ] && . $DEFAULT # Exit now if daemon binary is not installed test -x $DAEMON || exit 0 # Check that the user exists (if we set a user) # Does the user exist? if [ -n "$ACTIVEMQ_USER" ] ; then if getent passwd | grep -q "^$ACTIVEMQ_USER:"; then # Obtain the uid and gid DAEMONUID=`getent passwd |grep "^$ACTIVEMQ_USER:" | awk -F : '{print $3}'` DAEMONGID=`getent passwd |grep "^$ACTIVEMQ_USER:" | awk -F : '{print $4}'` else log_failure_msg "The user $ACTIVEMQ_USER, required to run $NAME does not exist." exit 1 fi fi # Check whether startup has been disabled if [ "$NO_START" != "0" -a "$1" != "stop" ]; then [ "$VERBOSE" != "no" ] && log_failure_msg "Not starting $NAME - edit /etc/default/$NAME and change NO_START to be 0 (or comment it out)." exit 0 fi # Check if any instances exists in instances-enabled directory check_instances_enabled() { if [ -d "$ACTIVEMQ_INSTANCES_ENABLED" ] && [ `/bin/ls $ACTIVEMQ_INSTANCES_ENABLED | wc -l` -gt 0 ]; then return 1 else return 0 fi } # Check if a given process pid's cmdline matches a given name running_pid() { pid=$1 [ -z "$pid" ] && return 1 [ ! -d /proc/$pid ] && return 1 cmd=`cat /proc/$pid/cmdline | tr "\000" "\n"|grep "activemq\.base" |cut -d= -f2` getinst=`basename $cmd` # Is this the expected server [ "x$getinst" != "x$INSTANCE" ] && return 1 return 0 } # Check if the process is running looking at /proc # (works for all users) running() { # No pidfile, probably no daemon present [ ! -f "$ACTIVEMQ_PIDFILE" ] && return 1 pid=`cat $ACTIVEMQ_PIDFILE` running_pid $pid || return 1 return 0 } # Start the process using the wrapper start_servers() { mkdir -p /var/run/activemq/ chown $ACTIVEMQ_USER /var/run/activemq/ if check_instances_enabled; then echo "No instances found at ${ACTIVEMQ_INSTANCES_ENABLED}." exit 0 fi for INSTANCE in `ls $ACTIVEMQ_INSTANCES_ENABLED`; do if [ -d "${ACTIVEMQ_INSTANCES_ENABLED}/${INSTANCE}" ]; then ACTIVEMQ_PIDFILE="/var/run/activemq/$INSTANCE.pid" ACTIVEMQ_CONFIG_DIR="$ACTIVEMQ_INSTANCES_ENABLED/$INSTANCE" export INSTANCE export ACTIVEMQ_USER export ACTIVEMQ_PIDFILE export ACTIVEMQ_HOME=/usr/share/activemq export ACTIVEMQ_CONFIG_DIR # Import global configuration . /usr/share/activemq/activemq-options # Import per instance configuration [ -r "${ACTIVEMQ_CONFIG_DIR}/options" ] && . ${ACTIVEMQ_CONFIG_DIR}/options log_progress_msg "$INSTANCE" start-stop-daemon --start --quiet --pidfile $ACTIVEMQ_PIDFILE \ --chuid $ACTIVEMQ_USER --background \ --name java --startas $DAEMON -- $ACTIVEMQ_ARGS errcode=$? if [ ! $errcode ]; then log_progress_msg "(failed)" else [ -n "$STARTTIME" ] && sleep $STARTTIME # Wait some time if running; then log_progress_msg "(running)" else log_progress_msg "(failed?)" fi fi else echo -n "${INSTANCE} (not an directory)" fi done } # Stops an running Instance stop_server() { INSTANCE=$1 ACTIVEMQ_PIDFILE="/var/run/activemq/$INSTANCE.pid" start-stop-daemon --stop --quiet --pidfile $ACTIVEMQ_PIDFILE \ --user $ACTIVEMQ_USER \ --name java --startas $DAEMON -- stop if running; then force_stop fi if running; then log_progress_msg "(failed)" else log_progress_msg "(stopped)" fi } # Stop the process using the wrapper stop_servers() { for INSTANCE in `ls /var/run/activemq/`; do INSTANCE=$(echo $INSTANCE | sed 's@.pid@@') log_progress_msg "$INSTANCE" stop_server "$INSTANCE" done } # Force the process to die killing it manually force_stop() { [ ! -e "$ACTIVEMQ_PIDFILE" ] && return if running ; then kill -15 $pid # Is it really dead? sleep "$DIETIME"s if running ; then kill -9 $pid sleep "$DIETIME"s if running ; then echo "Cannot kill $NAME (pid=$pid)!" exit 1 fi fi fi rm -f $ACTIVEMQ_PIDFILE } case "$1" in console) INSTANCE=$2 if [ ! -z $INSTANCE ]; then log_daemon_msg "Starting with Console $DESC " "$INSTANCE" if [ -r "${ACTIVEMQ_INSTANCES_ENABLED}/${INSTANCE}/activemq.xml" ]; then ACTIVEMQ_PIDFILE="/var/run/activemq/$INSTANCE.pid" ACTIVEMQ_CONFIG_DIR="$ACTIVEMQ_INSTANCES_ENABLED/$INSTANCE" if [ -f $ACTIVEMQ_PIDFILE ]; then stop_server "$INSTANCE" fi export INSTANCE export ACTIVEMQ_USER export ACTIVEMQ_PIDFILE export ACTIVEMQ_HOME=/usr/share/activemq export ACTIVEMQ_CONFIG_DIR # Import global configuration . /usr/share/activemq/activemq-options # Import per instance configuration [ -r "${ACTIVEMQ_CONFIG_DIR}/options" ] && . ${ACTIVEMQ_CONFIG_DIR}/options ACTIVEMQ_ARGS=$(echo $ACTIVEMQ_ARGS | sed 's/start/console/') start-stop-daemon --start --pidfile $ACTIVEMQ_PIDFILE \ --chuid $ACTIVEMQ_USER \ --name java --startas $DAEMON -- $ACTIVEMQ_ARGS else echo "File ${ACTIVEMQ_INSTANCES_ENABLED}/${BROKER}/activemq.xml not found." exit 1 fi else echo "Usage: $0 console foo" echo "This will start instance foo in foreground useful for debugging purposes." exit 1 fi log_end_msg 0 ;; start) log_daemon_msg "Starting $DESC " "$NAME" start_servers log_end_msg 0 ;; stop) log_daemon_msg "Stopping $DESC" "$NAME" stop_servers log_end_msg 0 ;; restart|force-reload) log_daemon_msg "Restarting $DESC" "$NAME" stop_servers start_servers log_end_msg 0 ;; status) log_daemon_msg "Checking status of $DESC" "$NAME" for INSTANCE in `ls $ACTIVEMQ_INSTANCES_ENABLED`; do if [ -d "${ACTIVEMQ_INSTANCES_ENABLED}/${INSTANCE}" ]; then ACTIVEMQ_PIDFILE="/var/run/activemq/${INSTANCE}.pid" log_progress_msg "$INSTANCE" if running; then log_progress_msg "(running)" else log_progress_msg "(stopped)" fi fi done log_end_msg 0 ;; reload) log_warning_msg "Reloading $NAME daemon: not implemented, as the daemon" log_warning_msg "cannot re-read the config file (use restart)." ;; *) echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload|status|console}" >&2 exit 1 ;; esac exit 0