Java Jar работает как Daemon не может выпустить exec () - PullRequest
1 голос
/ 17 августа 2011

У меня есть сервер сокетов Java, который я написал, чтобы позволить мне синхронизировать базу кода веб-кластеров. Когда я запускаю скрипт init.d из оболочки, войдите как

[root@web11 www]# /etc/init.d/servermngr start

Выйдите из системы и все будет работать нормально, но если сервер перезагружается или я запускаю init.d с помощью таких служб, как

[root@web11 www]# service servermngr start

Любая из команд exec (), переданных серверу сокетов, не будет выполняться в окне linux. Я предполагаю, что это связано с тем, что у JVM нет реальной оболочки. Если я захожу и запускаю

[root@web11 www]# /etc/init.d/servermngr start

... и выйти из системы все нормально, все команды CVS выполнены.

Еще одно замечание: при запуске в качестве службы сервер сокетов отвечает на проверки состояния, поэтому он работает

Вот скрипт init.d

#!/bin/sh
# chkconfig: 2345 95 1
# description: Starts Daemon Using ServerManager.jar.
# 
# Source function library.
. /etc/init.d/functions


start () {
    echo -n $"Starting ServerManager: "

    # start daemon
    cd /www/servermanager/
    daemon java -jar ServerManager.jar > /www/logs/ServerManager.log &
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && touch /var/lock/subsys/cups
    echo "";
    return $RETVAL
}

stop () {
    # stop daemon
    echo -n $"Stopping $prog: "
    kill `ps uax | grep -i "java -jar ServerManager.ja[r]" | head -n 1 | awk '{print $2}'`
    RETVAL=$?
    echo "";
    return $RETVAL
}

restart() {
    stop
    start
}

case $1 in
    start)
        start
    ;;
    stop)
        stop
    ;;
    *)

    echo $"Usage: servermngr {start|stop}"
    exit 3
esac

exit $RETVAL

И Java отвечает за фактическое выполнение кода:

// Build cmd Array of Strings
            String[] cmd = {"/bin/sh", "-c", "cd /www;cvs up -d htdocs/;cvs up -d phpinclude/"};
            final Process process;
            try {
                process = Runtime.getRuntime().exec(cmd);

                BufferedReader buf = new BufferedReader(new InputStreamReader(
                        process.getInputStream()));

                // Since this is a CVS UP we return the Response to PHP
                if(input.matches(".*(cvs up).*")){
                    String line1;
                    out.println("cvsupdate-start");
                    System.out.println("CVS Update" + input);
                    while ((line1 = buf.readLine()) != null) {
                        out.println(line1);
                        System.out.println("CVS:" + line1);
                    }
                    out.println("cvsupdate-end");
                }

            } catch (IOException ex) {
                System.out.println("IOException on Run cmd " + CommandFactory.class.getName() + " " + ex);
                Logger.getLogger(CommandFactory.class.getName()).log(Level.SEVERE, null, ex);
            }

Спасибо за любую помощь

Ответы [ 4 ]

0 голосов
/ 18 августа 2011

Вот скрипт запуска, который исправил мою проблему, если кто-то столкнулся с проблемой

#!/bin/sh
# chkconfig: 2345 95 1
# description: Starts Daemon Using ServerManager.jar.
# 
# Source function library.
. /etc/init.d/functions

RETVAL=0
prog="ServerManager"
servermanager="java"
serveroptions=" -jar ServerManager.jar"
pid_file="/var/run/servermanager.pid"

launch_daemon()
{
  /bin/sh << EOF
     java -Ddaemon.pidfile=$pid_file $serveroptions <&- &
     pid=\$!
     echo \${pid}
EOF
}

start () {
    echo -n $"Starting $prog: "
 if [ -e /var/lock/subsys/servermanager ]; then
                if [ -e /var/run/servermanager.pid ] && [ -e /proc/`cat /var/run/servermanager.pid` ]; then
                echo -n $"cannot start: servermanager is already running.";
                failure $"cannot start: servermanager already running.";
                echo
                return 1
                fi
        fi
    # start daemon
    cd /www/voodoo_servermanager/
    export CVSROOT=":pserver:cvsd@cvs.zzzzz.yyy:/cvsroot";
    daemon "$servermanager $serveroptions > /www/logs/ServerManager.log &"
    #daemon_pid=`launch_daemon`
    #daemon ${daemon_pid}
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && touch /var/lock/subsys/servermanager && pidof $servermanager > $pid_file
    echo "";
    return $RETVAL
}

stop () {
    # stop daemon
    echo -n $"Stopping $prog: "
        if [ ! -e /var/lock/subsys/servermanager ]; then
            echo -n $"cannot stop ServerManager:  ServerManager is not running."
            failure $"cannot stop ServerManager:  ServerManager is not running."
        echo
        return 1;
        fi
        killproc $servermanager
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/servermanager;
        return $RETVAL
}

restart() {
    stop
    start
}

case $1 in
    start)
        start
    ;;
    stop)
        stop
    ;;
    restart)
        restart
    *)

    echo $"Usage: servermngr {start|stop|restart}"
    RETVAL=1
esac

exit $RETVAL
0 голосов
/ 18 августа 2011

Вы запускаете процесс как root? Какая версия (bash?) Работает в системе? Возможно, вы захотите дать команду csh, чтобы исключить проблемы с самой оболочкой. Я бы также предложил объединить команды в цепочку '&' вместо ';'. Наконец, вам может оказаться проще создать сценарий оболочки, который содержит все ваши команды и вызывается вашим процессом Java. Вы также можете исследовать nohup и проверить / etc / security / limit

0 голосов
/ 18 августа 2011

Вы могли бы быть счастливее, используя http://akuma.kohsuke.org/, чтобы помочь вам с этим, или, по крайней мере, Apache Commons Exec.

0 голосов
/ 17 августа 2011

Какую команду вы пытаетесь выполнить? cd не программа, и если у вас ;, у вас есть несколько команд. Вы можете запустить только одну программу!

...