我已经编写了一个用于在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风格的初始化过程(rc.d)有基本的了解,但是查看像this one这样的示例脚本我觉得有点迷失。
所以我的问题是,在我的情况下是不是有更简单的方法?我的意思是,我的守护进程已经理解了这些命令,并且他们自己应该对任何动作负责(除非在守护进程没有响应停止的情况下 - 它应该在一些超时后被杀死)。
答案 0 :(得分:1)
你应该看看tanuki软件的java服务包装器 见http://wrapper.tanukisoftware.com/
我喜欢他们的方法是他们使用单一工具和常用脚本标准化了deamon和Windows服务流程。
我注意到这个工具在nexus,servicemix等其他高端项目中的应用水平很高。
当我遇到一个采用Java Service Wrapper来管理deamon进程的项目时,我已经熟悉了命令集和配置,这降低了学习曲线。
也许您可以将套接字控制器机制放入此现有框架中。
答案 1 :(得分:0)
不是一种更简单的方式
我写了一次daemon scripts来通过SSH启动我们的java应用程序。它们是简约的 - 没有强制终止或rc.d / SMF集成,只有守护进程启动和使用TERM信号关闭。