java - 更简单的 Java 守护程序初始化脚本?

标签 java linux daemon init rc

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

简而言之,该库提供了一个启动守护进程 Controller 线程的守护进程方法。它使用套接字让您的应用程序与其自身的实例通信(正如您可能已经知道的那样)。

为清楚起见,下面是您将如何使用它的示例:

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 风格的初始化过程 (rc.d) 有基本的了解,但查看示例脚本,如 this one我有点失落。

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

最佳答案

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

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

我注意到这个工具在一些知名项目(例如 nexus、servicemix 等)中得到了很好的采用。

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

也许您可以将您的套接字 Controller 机制融入这个现有的框架中。

关于java - 更简单的 Java 守护程序初始化脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5229847/

相关文章:

执行将进程作为守护进程运行的 shell 脚本时,Python 挂起

Python3 创建守护进程

java - 根据应用程序是在前台还是后台,通知显示不同

java - 在 Mac 上用 java 读取文件

linux - 什么是 EGL 以及如何使用它

c - 使用 C 在 Linux 上执行从键盘输入的命令时出现奇怪的错误

Java:无法使用 'localhost:1.0' 作为 DISPLAY 变量的值连接到 X11 窗口服务器

java - 打印不同的数组元素

java - 如何在spring boot中注册jpa转换器?

macos - 关闭终端后在后台运行进程