Как остановить выполнение Java-программы из командной строки? - PullRequest
8 голосов
/ 10 июня 2010

Моим основным полем является .Net, но в последнее время я как-то связан с Java.Мне нужно создать утилиту оболочки на Java, которая могла бы работать в фоновом режиме, читая несколько записей базы данных после указанной продолжительности, и выполнять дальнейшую обработку.Это своего рода планировщик.Теперь у меня мало вопросов:

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

Во-вторых, в конце концов, я могу остановить запуск этого процесса.Как этого добиться?

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

Любая помощь / совет, пожалуйста?

Ответы [ 5 ]

3 голосов
/ 10 июня 2010

Я предполагаю, что вы играете в свою Java-программу с Linux / Unix-сервером.Чтобы запустить приложение в качестве демона, вы можете попробовать

nohup java YourJavaClass &

. Чтобы остановить приложение, вы можете:

kill [psIdofYourApplication]

или

fg [your application job Id]
Ctrl-C

Если выхочу выполнить некоторую постобработку после того, как приложение получит сигнал kill / stop.check addShutdownHook (Thread hook)

Или sun.misc.SignalHandler

3 голосов
/ 10 июня 2010

Я бы пошел для запуска программы с помощью планировщика или службы.Однако, если вы хотите использовать bat-файл и делать это программно, я обрисовал в общих чертах возможный подход ниже:

В вашей Java-программе вы можете получить PID программно, а затем записать его в файл:1003 *

public static void writePID(String fileLocation) throws IOException
{
    // Use the engine management bean in java to find out the pid
    // and to write to a file
    if (fileLocation.length() == 0)
    {
        fileLocation = DEFAULT_PID_FILE;
    }       
    String pid = ManagementFactory.getRuntimeMXBean().getName();
    if (pid.indexOf("@") != -1) 
    {
        pid = pid.substring(0, pid.indexOf("@"));
    }                                               
    BufferedWriter writer = new BufferedWriter(new FileWriter(fileLocation));
    writer.write(pid);
    writer.newLine();
    writer.flush();
    writer.close();                     
}

Затем вы можете написать файл остановки .bat, который убьет работающую программу в Windows.Вы можете сделать что-то вроде:

setlocal
IF EXIST app.pid FOR /F %%i in ('type app.pid') do TASKKILL /F /PID %%i   
IF EXIST app.pid DEL app.pid
endlocal

Конечно, app.pid - это файл, написанный описанным выше методом Java.

Я не уверен, как вы сможете написать скрипт, который запускает Java-программу и отменяет контроль при завершении.Мне было бы интересно узнать, есть ли у кого-нибудь решение для этого.

1 голос
/ 10 июня 2010

Вы не указали платформу.Если вы работаете в Windows, вам нужно интегрироваться с Service Control для создания службы Windows.http://en.wikipedia.org/wiki/Windows_service. После того, как вы реализовали сервис-хуки, можно запускать и останавливать сервис через графический интерфейс управления сервисом или используя синтаксис net stop MyService из командной строки.

1 голос
/ 10 июня 2010
ps ux

см. pid

kill pid

Или лучше предоставить сценарий остановки, который сигнализирует о приложении, который выполняет System.exit(0)

0 голосов
/ 10 июня 2010

Как я понимаю, вы хотите что-то вроде этого:

if ( System.in.avaliable() > 0 ) {
  in = new BufferedReader( new InputStreamReader( System.in );
  String InLine = in.readLine();
  ...
}

Я прав?

...