Я написал небольшую библиотеку для создания сервисов / демонов на Java. Идея проста. При запуске приложения вы передаете команду и номер порта. Если команда является командой запуска, новый экземпляр вашего приложения будет запущен на указанном порту. В противном случае команда будет отправлена любому экземпляру, который может быть запущен на этом порту.
Короче говоря, библиотека предоставляет метод daemonize, который запускает поток контроллера демона. Он использует сокеты, чтобы приложение взаимодействовало с экземплярами самого себя (как вы, вероятно, уже поняли).
Для ясности, вот пример того, как вы бы его использовали:
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), но, глядя на примеры сценариев вроде этот , я чувствую себя немного потерянным.
Итак, мой вопрос: нет ли более простого способа сделать это в моем случае? Я имею в виду, что мои демоны уже понимают команды и сами должны нести ответственность за любые действия (за исключением случая, когда демон не отвечает на остановку - после некоторого времени ожидания его следует уничтожить).