我想使用 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-specific和http://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