2016-04-06 2 views
1

Я разработал сценарий оболочки, который вызывает основной метод Java-среды RHEL.Сценарий оболочки, вызывающий неосновный метод запуска java-программы

Shell скрипт (например app.sh) есть несколько вариантов на линиях tomcat.sh

start: Это запустит программу Java с помощью вызова основного метода

stop: Это будет получить работает идентификатор процесса и убить процесс

Я уже реализовал команду start и stop и с нетерпением жду выполнения команды pause.

pause:Этот параметр должен получить идентификатор процесса запущенного приложения Java и вызвать неосновной метод.

У меня нет проблем с получением идентификатора процесса. Но могу ли я вызвать нестандартный метод java-программы из запуска идентификатора процесса?

EDIT:

How can I call a method in an object from outside the JVM? вопрос предлагает решение в различных технологиях, но я не могу перейти к другой технологии, за исключением использования сценария оболочки.

+1

Я думаю, вы не можете этого сделать. Проверьте [this] (http://stackoverflow.com/questions/9411972/calling-java-methods-from-shell-scripts) для получения дополнительной информации. – dambros

+2

http://stackoverflow.com/questions/368802/how-can-i-call-a-method-in-an-object-from-outside-the-jvm – user3159253

+0

Я проверил этот вопрос. Но я хочу назвать не основной метод существующего процесса, а не вызывать новый основной метод нового процесса –

ответ

2

решение будет иметь следующий вид:

  1. Создание службы как обычно.
  2. Служба предоставляет ряд методов через JMX или просто прослушивая сокет TCP/unix-домена для ограниченного набора известных команд.
  3. Когда необходимо управлять, служба выделенного процесса (предположительно, служебная программа, написанная на Java, отдельно от службы), выдает необходимые команды через назначенный командный канал.

SO question that I mentioned in the comments содержит все необходимые технические данные. На самом деле все кредиты должны предоставляться там, я просто перестраиваю их слова.

В качестве альтернативы в Unix-подобных системах, включая Linux, вы можете послать сигнал SIGSTOP для данного PID (kill -STOP <pid>), и виртуальная машина будет остановлена ​​до тех пор, безусловно SIGCONT не получил (kill -CONT <pid>). Но я предполагаю, что это будет чрезвычайно жестокое решение. Вероятно, вы потеряете все открытые соединения и т. Д.

1

Я нашел одно решение, чтобы избавиться от ограничения, которое она выполнит скриптом, называя только основной метод программы.

  1. URL-адрес RMI программы A сохраняется в базе данных или в файловой системе.
  2. Программа B считывает URL-адрес RMI.
  3. Начальный вариант вызова сценариев основной метод программы A. Пауза опция вызова сценариев основной метод программы B.
  4. Программа B вызывает удаленный метод программы A.

Еще одно решение: вызвать страницу jsp, которая вызывает удаленный метод в программе A с помощью команды wget из сценария в режиме паузы.

Смежные вопросы