【问题标题】:Simpler init script for Java daemons?Java 守护进程的更简单的初始化脚本?
【发布时间】:2011-03-08 08:00:46
【问题描述】:

我编写了一个小型库,用于在 Java 中创建服务/守护程序。这个想法很简单。当您启动应用程序时,您会传递一个命令和一个端口号。如果该命令是启动命令,您的应用程序的新实例将在指定端口上启动。否则,命令将被发送到可能在该端口上运行的任何实例。

简而言之,该库提供了一个启动守护进程控制器线程的守护进程方法。它使用套接字使您的应用程序与自身的实例进行通信(您可能已经想通了)。

为了清楚起见,下面是一个如何使用它的示例:

public class MyApp extends Daemon
{
    public static void main(String[] args)
    {
        if (daemonize(MyApp.class, args))
        {
            // normal main body
            startMyServerOrWhatever();
        }
        else
        {
            // failed to start or send command to daemon
            // probably wrong syntax or unknown command
            printUsageInfoAndExit();
        }
    }

    @Command(start = true)
    public static int start()
    {
        // executed on "start" command, e.g. java -jar MyApp.jar start 8899
        doSomeInitializing();
        return 0; // return 0 or void to detach from console
    }

    @Command
    public static void mycmd()
    {
        // executed on "mycmd" command, i.e. java -jar MyApp.jar mycmd 8899
        doSomethingCool();
    }

    @Command(stop = true)
    public static int stop()
    {
        // executed on "stop" command, i.e. java -jar MyApp.jar stop 8899
        doSomeCleanup();
        return 0; // used as application exit code
    }
}

该库运行良好,我用它创建了几个将在 Linux 服务器上运行的守护程序。现在缺少的是一些脚本,可以让管理员控制这些守护进程,就像他们控制服务器上的其他守护进程一样(例如,在启动时启动)。

不幸的是,我的 *nix 技能,尤其是在编写脚本方面,并不是顶级水平。我对 BSD 风格的 init 过程(rc.d)有一个基本的了解,但是看着像 this one 这样的示例脚本,我感到有些失落。

所以我的问题是,就我而言,没有更简单的方法吗?我的意思是,我的守护进程已经理解了这些命令,并且应该自己负责任何操作(除非守护进程没有响应停止 - 然后应该在超时后被杀死)。

【问题讨论】:

    标签: java linux daemon init rc


    【解决方案1】:

    你真的应该看看 tanuki 软件的 java 服务包装器。
    http://wrapper.tanukisoftware.com/

    我喜欢他们的方法的一点是,他们使用单一工具和通用脚本标准化了守护进程和 Windows 服务进程。

    我注意到该工具在一些知名项目(例如 nexus、servicemix 等)中的采用程度很高。

    当我遇到一个项目采用Java Service Wrapper来管理守护进程时,命令集和配置对我来说已经很熟悉了,这降低了学习曲线。

    也许您可以将您的套接字控制器机制安装到这个现有的框架中。

    【讨论】:

    • 实际上,在构建这个库之前,我确实查看了 Java Service Wrapper(以及其他一些替代方案)。然而,我觉得它们对我的口味来说都太“重”了。这是一件非常简单的事情,我想保持这种状态。不过感谢您的提示!
    【解决方案2】:

    有没有更简单的方法

    我写过一次daemon scripts 来通过 SSH 启动我们的 java 应用程序。它们是极简的 - 没有强制终止或 rc.d/SMF 集成,只有使用 TERM 信号启动和关闭守护程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      • 2018-08-10
      • 2011-01-22
      • 2011-03-22
      相关资源
      最近更新 更多