我试图将java程序作为服务运行。 我的要求是:
1)在机器启动时启动java程序
2)如果java程序崩溃重启
3)作为特殊用户在特殊目录中执行
旁注:我不能假设这是唯一运行的java进程,并且意外地运行该服务两次将是危险的。
到目前为止,我已尝试使用start-stop-daemon实现它。但是,应用程序在崩溃时不会自动重新启动(即,以非零退出代码终止)。我想它有事情要做,我需要使用--background,因此,start-stop-daemon无法确定退出代码?我对么?如何正确解决此问题? (我更喜欢只有系统功能的解决方案,由于安全限制,没有第三方工具会更容易)
我当前的脚本(正如同样的说法,Dummy是一个永远睡眠的虚拟Java应用程序)
#!/bin/sh
### BEGIN INIT INFO
# Provides: CI Master
# Required-Start: $all
# Required-Stop: $all
# Should-Start: $portmap
# Should-Stop: $portmap
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# X-Interactive: false
# Short-Description: CI Master
# Description: CI Master
### END INIT INFO
SERVICE_NAME="CI Master"
PIDFILE=/var/run/CI_master.pid
USER=ci
DIRECTORY=./master/
EXECUTABLE=/usr/bin/java
ARGUMENTS="Dummy"
. /lib/lsb/init-functions
case "$1" in
start)
log_daemon_msg "Starting $SERVICE_NAME" "$SERVICE_NAME"
start-stop-daemon --pidfile $PIDFILE --make-pidfile --background --chuid $USER --chdir /home/$USER/$DIRECTORY/ --startas $EXECUTABLE --start -- $ARGUMENTS
log_daemon_msg "$SERVICE_NAME started" "$SERVICE_NAME"
;;
stop)
log_daemon_msg "Stopping $SERVICE_NAME" "$SERVICE_NAME"
start-stop-daemon --pidfile $PIDFILE --remove-pidfile --stop
log_daemon_msg "$SERVICE_NAME stopped" "$SERVICE_NAME"
;;
restart|reload|force-reload)
$0 stop
sleep 1
$0 start
;;
status)
start-stop-daemon --pidfile $PIDFILE --status
case $! in
0)
log_daemon_msg "$SERVICE_NAME is running" "$SERVICE_NAME"
;;
1)
log_daemon_msg "$SERVICE_NAME is not running (pid file exists)" "$SERVICE_NAME"
;;
2)
log_daemon_msg "$SERVICE_NAME is not running" "$SERVICE_NAME"
;;
3)
log_daemon_msg "unable to determine status of $SERVICE_NAME" "$SERVICE_NAME"
;;
esac
;;
esac
exit 0
提前致谢!
答案 0 :(得分:2)
我建议使用DaemonTools + service / chkconfig。
您的平台上已经安装了DaemonTools,或者您可以尝试使用apt-get。它将在最多5秒内自动重启你的守护进程。
您可以查看linux用户手册8,了解有关service / chkconfig的更多信息。
希望这有用。
答案 1 :(得分:1)
我为此使用了Apache Commons Daemon Tools ......
JSvc将为您重新生成Java服务流程......
Jsvc使用3个进程:启动程序进程,控制器进程和受控进程。受控进程也是主要的java线程,如果JVM崩溃,控制器将在下一分钟重新启动它。 Jsvc是守护进程,因此应该以root身份启动,-user参数允许降级为非特权用户。当使用-wait参数时,启动程序进程将等待,直到控制器显示"我准备好了#34;否则它会在创建控制器进程后返回。
JSvc将编写一个PID文件。因此, -stop 命令也可以停止正在运行的服务。
JSvc -user 将允许您在启动后将您的服务降级为权限较低的用户。
它还与 ProcRun.exe 兼容,在Windows上运行良好。
答案 2 :(得分:0)
我可以推荐另一种解决方案 - Java Service Wrapper http://wrapper.tanukisoftware.com/doc/english/introduction.html