2011-08-17 338 views
1

我有一個Java套接字服務器,我寫的允許我保持Web羣集代碼庫同步。當我從一個shell登錄時運行的腳本init.d中像這樣Java Jar作爲守護進程運行exec()

[[email protected] www]# /etc/init.d/servermngr start 

註銷,所有將正常工作,但如果在服務器重新啓動或運行我使用的服務,像這樣

[[email protected] www]# service servermngr start 

中的init.d任何傳遞給套接字服務器的exec()命令都不會在Linux機器上執行。我假設它與沒有真正shell的JVM有關。如果我登錄並運行

[[email protected] 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); 
      } 

THX任何幫助

+1

你有沒有什麼消息? – Ingo

+0

我檢查了我寫入的日誌文件,它正在接收命令。它只是不在服務器上執行 – Ehask

+0

[root @ web11〜]#tail -f /www/logs/ServerManager.log 服務器啓動ip 192.168.56.151 服務器啓動端口4444 MaxConnections:0 CVS更新:cd/www; cvs up -d htdocs /; cvs up -d phpinclude/ CVS更新:cd/www; cvs up -d htdocs /; cvs up -d phpinclude/ 因此,這些命令使它成爲'進程= Runtime.getRuntime()。exec(cmd);' @Ingo – Ehask

回答

0

什麼是日你試圖運行的命令? cd不是一個程序,如果你有;你有多個命令。你只能運行一個程序!

+0

套接字服務器獲取命令發送給它,並且它們以這種方式發出: String [] cmd = {「/ bin/sh」,「-c」 ,「cd/www; cvs up -d htdocs /; cvs up -d phpinclude /」} process = Runtime.getRuntime()。exec(cmd); – Ehask

+0

這很好。 'sh'是一個單獨的命令。如果失敗會得到什麼錯誤信息?如果你想執行遠程命令,你是否考慮過爲此設計的'ssh'? –

+0

套接字服務器現在正常運行,但這是因爲我登錄到所有10個服務器併發出/etc/init.d/servermngr start然後退出。如果他們的服務器出現故障或重新啓動,操作系統將啓動服務servermngr start(我也嘗試添加到rc.local),然後命令不再傳遞到服務器操作系統Linux。我從Linux或Java沒有錯誤。一旦我登錄到服務器並執行服務servermngr stop並啓動/etc/init.d/servermngr,它將再次工作,但我需要它通過服務工作 – Ehask

0

你是否以root身份啓動進程?系統上運行的是什麼版本的(bash?)?你可能想給csh一個漩渦只是爲了排除shell本身的問題。我還建議用'&'而不是';'鏈接命令。最後,您可能會發現創建一個包含所有命令並由您的java進程調用的shell腳本更容易。您可能還想調查nohup並檢查/ etc/security/limits

+0

bash --version GNU bash,版本3.2.25(1)-release(x86_64-redhat-linux-gnu) – Ehask

+0

我看到的唯一問題是我不能向OS發出任何命令。我想知道是否因爲java程序在重啓或通過服務啓動時沒有在shell中運行。我會嘗試&cmds – Ehask

+0

,並且它是以root身份運行 – Ehask

0

這裏是固定我的問題的啓動腳本,如果有人跑進一個問題

#!/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:[email protected]:/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