Ubuntu mata programa java iniciado por bash

1

Eu tenho um problema com a morte do meu programa Java no Ubuntu. Eu criei o seguinte script de inicialização:

#!/bin/sh

### BEGIN INIT INFO
# Provides:          control ...
# Required-Start:    $remote_fs $network $syslog
# Required-Stop:     $remote_fs $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: ...
# Description:       ...
### END INIT INFO

DAEMON_PATH="/mnt/Data/wstlm"
DAEMON=startWstlm
DAEMONOPTS=""

NAME=wstlm
DESC="My daemon description"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

case "$1" in
start)
        printf "%-50s" "Starting $NAME..."
        cd $DAEMON_PATH
        PID='./$DAEMON $DAEMONOPTS > /dev/null 2>&1 & echo $!'
        echo "Saving PID" $PID " to " $PIDFILE
        if [ -z $PID ]; then
            printf "%s\n" "Fail"
        else
            echo $PID > $PIDFILE
            printf "%s\n" "Ok"
        fi
;;
status)
        printf "%-50s" "Checking $NAME..."
        if [ -f $PIDFILE ]; then
            PID='cat $PIDFILE'
            if [ -z "'ps axf | grep ${PID} | grep -v grep'" ]; then
                printf "%s\n" "Process dead but pidfile exists"
            else
                echo "Running"
            fi
        else
            printf "%s\n" "Service not running"
        fi
;;
stop)
        printf "%-50s" "Stopping $NAME"
            PID='cat $PIDFILE'
            cd $DAEMON_PATH
        if [ -f $PIDFILE ]; then
            kill -9 $PID
            printf "%s\n" "Ok"
            rm -f $PIDFILE
        else
            printf "%s\n" "pidfile not found"
        fi
;;

restart)
    $0 stop
    $0 start
;;

*)
        echo "Usage: $0 {status|start|stop|restart}"
        exit 1
esac

Este script de inicialização altera o diretório para o meu programa e o conteúdo do startWstlm executado é:

#!/bin/sh
echo date +"%Y/%m/%d %T" - start WSTLm 1>>/mnt/Data/wstlm/wstlm.log
java -Djavax.net.ssl.trustStore=jssecacerts -jar /mnt/Data/wstlm/myProgram.jar

Eu adicionei o script de inicialização ao init.d. Se eu ligar

sudo service myProgram start

O programa é iniciado corretamente. Mas se eu usar

sudo service myProgram stop

O programa não é desligado. Apenas o comando bash que iniciou meu programa java é eliminado.

Antes de executar a parada:

1 root /bin/sh ./startWstlm
2 root java -Djavax.net.ssl.trustStore=jssecacerts -jar /mnt/Data/wstlm/myProgram.jar
3 root java -Djavax.net.ssl.trustStore=jssecacerts -jar /mnt/Data/wstlm/myProgram.jar
4 root java -Djavax.net.ssl.trustStore=jssecacerts -jar /mnt/Data/wstlm/myProgram.jar

Depois de executar a parada:

(note this bash was killed)
2 root java -Djavax.net.ssl.trustStore=jssecacerts -jar /mnt/Data/wstlm/myProgram.jar
3 root java -Djavax.net.ssl.trustStore=jssecacerts -jar /mnt/Data/wstlm/myProgram.jar
4 root java -Djavax.net.ssl.trustStore=jssecacerts -jar /mnt/Data/wstlm/myProgram.jar

(A propósito: por que existem vários processos desse jarro?)

Então o problema é que eu não consigo parar meu programa. O que é meio que ... chato. Alguém tem uma ideia?

    
por No3x 18.03.2013 / 15:17

1 resposta

0

Primeiro, não use kill -9 ; um simples kill deve ser suficiente. Segundo, veja esta página para uma boa explicação de como matar processos filhos quando o pai é instruído a sair. Nesse caso, startWstim precisa cuidar de matar o programa Java antes de sair.

Por fim, pode ser mais simples dispensar startWstim e, em vez disso, executar os comandos que ele contém diretamente em seu script de inicialização:

start)
    printf "%-50s" "Starting $NAME..."
    cd $DAEMON_PATH
    echo "$(date +"%Y/%m/%d %T") - start WSTLm" >> /mnt/Data/wstlm/wstlm.log
    java -Djavax.net.ssl.trustStore=jssecacerts -jar /mnt/Data/wstlm/myProgram.jar &
    PID=$!

Note que você não precisa de um subshell para obter o ID do processo do programa Java, e você precisa capturar a saída do comando date para imprimi-lo no arquivo de log.

    
por 19.03.2013 / 23:44