繁体   English   中英

Java Jar 作为守护进程运行无法发出 exec()

[英]Java Jar run as Daemon cant issue exec()

我有一个 java 套接字服务器,我写的这个服务器允许我保持 web 集群代码库同步。 当我从 shell 登录运行 init.d 脚本时,像这样

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

注销并且一切正常,但是如果服务器重新启动或者我使用这样的服务运行 init.d

[root@web11 www]# service servermngr start

任何传递给套接字服务器的 exec() 命令都不会在 linux 盒子上执行。 我假设它与没有真正的 shell 的 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);
            }

感谢任何帮助

您尝试运行的命令是什么? cd不是程序,如果你有; 你有多个命令。 您只能运行一个程序!

您是否以 root 身份启动该过程? 系统上正在运行什么版本的(bash?)? 您可能想试一试 csh 以排除 shell 本身的问题。 我还建议使用 '&' 而不是 ';' 链接命令。 最后,您可能会发现创建包含所有命令并由 java 进程调用的 shell 脚本更容易。 您可能还想调查 nohup 并检查 /etc/security/limits

您可能会更乐意使用http://akuma.kohsuke.org/来帮助您解决这些问题,或者至少使用 Apache Commons Exec。

如果有人遇到问题,这是解决我的问题的启动脚本

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM