开发者

Java Jar run as Daemon cant issue exec()

开发者 https://www.devze.com 2023-03-28 13:54 出处:网络
I have a java socket server I wrote to allow me to keep a web clusters code base in sync. When I run the init.d script from a shell login like so

I have a java socket server I wrote to allow me to keep a web clusters code base in sync. When I run the init.d script from a shell login like so

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

Logout and all will work fine but if the server reboots or I run the init.d using services like so

[root@web11 www]# service servermngr start

Any of the exec() commands passed to the socket server will not get executed on the linux box. I am assuming it has to do with the JVM having no real shell. If I login and run

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

...and logout all runs nice all CVS commands are executed.

Another note when run as a service the socket server responds to status checks so it is running

Here is the init.d script

#!/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)
开发者_JAVA百科        start
    ;;
    stop)
        stop
    ;;
    *)

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

exit $RETVAL

And the Java responsible for actually executing the code:

// 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);
            }

Thx for any help


What is the command you are trying to run? cd is not a program and if you have ; you have multiple commands. You can only run one program!


Are you starting the process as root? What version of (bash?) is running on the system? You may want to give csh a whirl just to rule out issues with the shell itself. I'd also suggest chaining the commands with '&' instead of ';'. Finally you may find it easier to create a shell script which contains all your commands and is called by your java process. You may also want to investigate nohup and check /etc/security/limits


You might be happier using http://akuma.kohsuke.org/ to help you with this stuff, or at least Apache Commons Exec.


Here is the startup script that fixed my issue if someone runs into an issue

#!/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

精彩评论

暂无评论...
验证码 换一张
取 消