【发布时间】: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 这样的示例脚本,我感到有些失落。
所以我的问题是,就我而言,没有更简单的方法吗?我的意思是,我的守护进程已经理解了这些命令,并且应该自己负责任何操作(除非守护进程没有响应停止 - 然后应该在超时后被杀死)。
【问题讨论】: