【问题标题】:Launch Java application at startup on Centos在 Centos 上启动时启动 Java 应用程序
【发布时间】:2014-05-20 11:23:29
【问题描述】:

我需要在 Centos (5.9) 启动时启动 Java 应用程序。

我正在尝试在启动时在 Centos 上启动一个简单的脚本(名为“lanzar.sh”):

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

我将“/bin/sh /home/someuser/Desktop/Dist/lanzar.sh”行附加到/etc/rc.d/rc.local。但是java应用程序没有启动。我有:

  • 授予 /etc/rc.d/rc.local 文件 755 权限
  • 将“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

注意:我知道以前有人问过类似的问题,但是在测试了我通过谷歌搜索找到的许多答案后都没有成功,我不得不自己问这个问题。

【问题讨论】:

  • 那个 java 应用是做什么的?它是否需要访问某些用户数据?它需要X服务器吗?它是否取决于要设置的某些环境变量?当您尝试此操作时,应用程序是否会记录任何错误消息?如果您在该脚本(到日志文件)中添加一些回显行,日志文件会被写入吗?
  • 根据您的建议,我在其他命令之前添加了 -echo "Some log" > /var/log/mylog- 这一行。未生成日志。所以我认为问题是 rc.local 根本没有被执行。我不得不说,在问题开始发生之前,我替换了原始文件,但后来我运行了 -chmod 755 /etc/rc.d/rc.local-
  • 将日志命令放入 rc.local 看看会发生什么。请记住,rc.local 不是以您的用户身份运行的,因此可能对您用户的主目录/etc 中的文件具有权限,也可能没有权限。
  • @EtanReisner ,实际上这就是我所做的。我将日志行(echo "Some log" > /var/log/mylog)放在 rc.local 中的第一个命令之前,但未创建日志文件。这就是为什么我认为 rc.local 没有被执行。至于用户目录的权限,当我以 root 身份从命令行运行应用程序时,它工作正常,但是我将把应用程序放在根子目录中进行测试。

标签: bash centos startup


【解决方案1】:

我强烈建议您探索服务器的/etc/init.d 目录和/etc/rc3.d 目录。查看/etc/rc3.d 中的文件名如何通过符号链接到/etc/init.d 目录中的名称。注意/etc/rc3.d 中的文件都是如何以Sxx 开头的,或者Kxxwherexx 是0099 之间的一个数字。

我要告诉你的事情在官方上是完全错误的。这些启动脚本今天比我描述的要复杂得多,但它是正在发生的事情的基本概述。

在标准的 Unix 和 Linux 中,启动脚本通常存储在 /etc/init.d 中,然后链接到 /etc/rcX.d 目录,其中 X 代表所谓的服务器的 Init States。 (是的,我链接到一个 SCO Unix 页面,但它们都非常相似)。

请注意,Init State 3 正在多用户模式下运行,并且所有守护程序都已启动。这就是我告诉你查看/etc/rc3.d的原因。

当服务器进入 init 状态 时,它会按字母顺序运行以S 开头的所有脚本。它使用参数start 运行每个脚本。所以,S01xxxxS03xxx 之前开始,在 S99xxxxx 之前开始。

当服务器退出该初始化状态时,它会按字母顺序运行所有以K 开头的脚本,并将stop 参数传递给它们。

现在,Centos、Redhat 和 Fedora 设置为您处理了很多这样的事情。您指定您依赖的服务,它会计算出启动和关闭顺序。但是,没有什么能阻止您修改启动脚本并创建自己的链接。

顺便说一下,关于启动和关闭的 Java 程序...Jenkins 是一个 Java 程序,它的启动方式与您的程序非常相似。这是我从 Jenkins 网站上下载的 /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

它会给你一些工作。

【讨论】:

  • 根据我发现的 Jenkins 和其他示例创建 /etc/init.d 脚本,我能够将应用程序作为服务启动。将脚本添加到启动的命令是 -/sbin/chkconfig --level 345 SomeApp on-
猜你喜欢
  • 2019-03-21
  • 2017-06-01
  • 2016-08-05
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多