start-stop-daemon和java - 怎么做对了?

时间:2015-05-14 17:22:35

标签: java ubuntu

我试图将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

提前致谢!

3 个答案:

答案 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