2014-04-08 106 views
3

我需要在Centos(5.9)啓動時啓動Java應用程序。在CentOS上啓動時啓動Java應用程序

我試圖啓動一個簡單的腳本(名爲 「lanzar.sh」)在CentOS在啓動時:

#!/bin/sh 
cd /home/someuser/Desktop/Dist 
java -jar SomeApp.jar 

我追加行「/ bin/sh的/家庭/ SomeUser的/桌面/距離/ lanzar.sh「到/etc/rc.d/rc.local。但是Java應用程序無法啓動。我有:

  • 授予755個權限到/etc/rc.d/rc.local文件中
  • 寫 「lanzar.sh」 到/etc/rc.d/rc.local文件的內容。用分號隔開,並用不同的行。
  • 更改位置的「lanzar.sh」。
  • 其他事情,取自其他線程,不適合我。

我rc.loca樣子:

#!/bin/sh 

# 

# This script will be executed *after* all the other init scripts. 

# You can put your own initialization stuff in here if you don't 

# want to do the full Sys V style init stuff. 
# 
#Some comment 

#Some comment 

#Some comment 
touch /var/lock/subsys/local 
/bin/sh /home/fernando/Desktop/Dist/lanzar.sh 

注:我知道類似的問題已經被問過,但在測試很多,我用沒有成功谷歌上搜索發現問題的答案後,我有自己問這個。

+0

那個java應用程序做什麼?它是否需要訪問某些用戶數據?它需要X服務器嗎?它是否依賴於要設置的特定環境變量?當您嘗試此操作時,應用程序是否記錄任何錯誤消息?如果在該腳本中添加一些回顯行(對日誌文件),日誌文件是否會寫入? –

+0

通過你的消化,我在其他命令之前添加了一行-echo「Some log」>/var/log/mylog-。日誌沒有生成。所以我認爲問題是rc.local根本沒有被執行。我必須說,在問題開始發生之前,我替換了原始文件,但後來運行了-chmod 755 /etc/rc.d/rc.local- – Ferite

+0

將log命令放入rc.local中,看看會發生什麼。請記住,rc.local並未作爲用戶運行,因此可能有權或無權訪問用戶主目錄/ etc中的文件。 –

回答

5

我強烈建議您瀏覽服務器的/etc/init.d目錄和/etc/rc3.d目錄。查看/etc/rc3.d中的文件名稱是如何與/etc/init.d目錄中的名稱符號鏈接的。注意/etc/rc3.d中的文件全部以Sxx或Kxx where開頭,其中xx是0099之間的數字。

我要告訴你的是正式的錯誤。這些啓動腳本在今天描述的方式更加複雜,但它是發生了什麼的基本輪廓。

在標準的Unix和Linux,啓動腳本通常被存儲在/etc/init.d,然後鏈接到/etc/rcX.d目錄下X站中所謂的服務器Init States。 (是的,我鏈接到一個SCO Unix頁面,但它們都非常相似)。

請注意,Init State 3以多用戶模式運行,並且所有守護進程都已啓動。這就是爲什麼我要告訴你看看/etc/rc3.d

當服務器進入初始狀態時,它按字母順序運行以S開頭的所有腳本。之後它會運行參數爲start的每個腳本。所以,S01xxxxS03xxx之前開始,其在S99xxxxx之前開始。

當服務器退出該初始狀態,它運行所有以K按字母順序啓動腳本,並傳遞stop參數給他們。

現在,Centos,Redhat和Fedora安裝程序可以爲您處理大量此類問題。您可以指定您依賴的服務,並計算啓動和關閉順序。但是,沒有任何東西阻止您啓動啓動腳本並創建自己的鏈接。

順便說一句,關於啓動和關閉Java程序... Jenkins是一個Java程序,它以與您的程序非常類似的方式啓動。這裏的/etc/init.d腳本我有詹金斯網站的關閉:

#!/bin/bash 
# 
# Startup script for Jenkins 
# 
# chkconfig: - 84 16 
# description: Jenkins CI server 

# Source function library. 
. /etc/rc.d/init.d/functions 
[ -z "$JAVA_HOME" -a -x /etc/profile.d/java.sh ] && . /etc/profile.d/java.sh 

JENKINS_HOME=/var/jenkins 
WAR="$JENKINS_HOME/jenkins.war" 
LOG="/var/log/jenkins.log" 
LOCK="/var/lock/subsys/jenkins" 
export JENKINS_HOME 

RETVAL=0 

pid_of_jenkins() { 
    pgrep -f "java.*jenkins" 
} 

start() { 
    [ -e "$LOG" ] && cnt=`wc -l "$LOG" | awk '{ print $1 }'` || cnt=1 

    echo -n $"Starting jenkins: " 

    cd "$JENKINS_HOME" 
    nohup java -jar "$WAR" --httpPort=-1 --ajp13Port=8010 --prefix=/jenkins >> "$LOG" 2>&1 & 

    while { pid_of_jenkins > /dev/null ; } && 
     ! { tail +$cnt "$LOG" | grep -q 'Winstone Servlet Engine .* running' ; } ; do 
     sleep 1 
    done 

    pid_of_jenkins > /dev/null 
    RETVAL=$? 
    [ $RETVAL = 0 ] && success $"$STRING" || failure $"$STRING" 
    echo 

    [ $RETVAL = 0 ] && touch "$LOCK" 
} 

stop() { 
    echo -n "Stopping jenkins: " 

    pid=`pid_of_jenkins` 
    [ -n "$pid" ] && kill $pid 
    RETVAL=$? 
    cnt=10 
    while [ $RETVAL = 0 -a $cnt -gt 0 ] && 
     { pid_of_jenkins > /dev/null ; } ; do 
      sleep 1 
      ((cnt--)) 
    done 

    [ $RETVAL = 0 ] && rm -f "$LOCK" 
    [ $RETVAL = 0 ] && success $"$STRING" || failure $"$STRING" 
    echo 
} 

status() { 
    pid=`pid_of_jenkins` 
    if [ -n "$pid" ]; then 
     echo "jenkins (pid $pid) is running..." 
     return 0 
    fi 
    if [ -f "$LOCK" ]; then 
     echo $"${base} dead but subsys locked" 
     return 2 
    fi 
    echo "jenkins is stopped" 
    return 3 
} 

# See how we were called. 
case "$1" in 
    start) 
     start 
     ;; 
    stop) 
     stop 
     ;; 
    status) 
     status 
     ;; 
    restart) 
     stop 
     start 
     ;; 
    *) 
     echo $"Usage: $0 {start|stop|restart|status}" 
     exit 1 
esac 

exit $RETVAL 

它會給你一些幫助。

+1

根據我發現的Jenkin和其他示例創建一個/etc/init.d腳本,我可以將該應用作爲服務啓動。將腳本添加到啓動的命令是 -/sbin/chkconfig --level 345 SomeApp on- – Ferite

相關問題