2014-04-08 54 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

相关问题