使用 Upstart 启动 Java 进程

使用 Upstart 启动 Java 进程

我想使用 Upstart 启动一个 Java 进程。目前,在我们的 OpenSuSE 服务器上,我使用 System V init 系统来实现这一点,但在我们的 Ubuntu 服务器上,我更愿意使用 Upstart。但我有两个问题...

我有一项配置服务器的 Upstart 作业(任务),名为 myconfig。在启动我的 java 进程的作业中,我表面上有:

start on stopped myconfig
exec /path/to/myjavastartscript.sh

myjavastartscript.sh 运行“java -classpath blah MyClass”。在 System V init 中,启动服务运行“nohup /path/to/myjavastartscript.sh &”。

所以我的第一个问题是我是否仍然需要使用 exec 命令执行 nohup 或在后台运行?

在运行时,MyClass 会启动其他 Java 进程。在 System V init 中,服务停止只会查找某个用户拥有的 Java 进程并终止它们。我的第二个问题是如何使用 Upstart 控制这些进程的终止?

答案1

您不需要使用,nohup因为当 Upstart 运行程序时,该进程将不会与终端关联(默认情况下)。

对于 Upstart,我建议只需进行以下工作调用:

exec java -classpath blah MyClass

...或确保/path/to/myjavastartscript.sh 调用:

exec java -classpath blah MyClass

请注意,上面的第一个exec是 Upstart 节,而第二个是 shell 关键字。如果您的 shell 脚本未调用的 shell 版本exec,则需要小心确保expect正确设置了 Upstart 节 - 请参阅http://upstart.ubuntu.com/cookbook/#expect

对于停止服务,Upstart 将自动终止其正在跟踪的进程(与 相关联的主 JVM 进程MyClass)以及该进程的任何子进程(技术上是同一进程组中的任何进程(请参阅http://upstart.ubuntu.com/cookbook/#stopping-a-job))。

如果没有更多详细信息,我不确定您的start on条件是否合适 - 大概是您希望 MyClass 作业在且仅当已设置配置文件时才启动?如果是这样,则作业节的标准用法是pre-start读取/etc/default/MyClass.conf。如果它确定文件不存在,或者配置文件以某种方式指示服务被禁用/未正确设置,则pre-start可以简单地调用stop以停止作业(完全)启动(请参阅http://upstart.ubuntu.com/cookbook/#pre-start)。这种方法的优点是,您start on可以可靠地将条件设置为导致作业启动的任何条件集。当满足这些条件时,Upstart 将运行该作业;预启动将运行,确定配置尚未生效并直接退出。当管理员决定配置服务时,作业将完全启动。

http://upstart.ubuntu.com/cookbook/#determining-the-start-on-condition-ubuntu-specifichttp://upstart.ubuntu.com/cookbook/#ubuntu-well-known-events-ubuntu-specific以确定start on条件。

最后请注意,你确实应该始终指定一个stop on条件。请参阅http://upstart.ubuntu.com/cookbook/#stop-on

答案2

我遇到了同样的问题,想要在启动机器时启动 serviio dlna 服务器。

这是我的/etc/init/serviio.conf

description "Start serviio DLNA server"
author "aanno"

start on net-device-up IFACE=eth0
stop on runlevel [!2345]
env enabled=1

setuid tpasch
setgid tpasch

#respawn the process if it crashes
respawn

env SERVIIO_HOME=/home/tpasch/serviio-1.0.1
script
        [ "$enabled" = "1" ] || [ "$force_start" = "1" ] || exit 0
        # Setup Serviio specific properties
        JAVA_OPTS="-Djava.net.preferIPv4Stack=true -Djava.awt.headless=true -Dderby.system.home=$SERVIIO_HOME/library -Dserviio.home=$SERVIIO_HOME -Xmx512M -Xms20M -XX:+UseParNewGC -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=20"

        # construct classpath
        cd $SERVIIO_HOME
        CLASSPATH="config"

        for i in lib/*.jar; do
                CLASSPATH="$CLASSPATH:$i"
        done

        exec /usr/bin/java $JAVA_OPTS -classpath $CLASSPATH org.serviio.MediaServer
end script

相关内容