Как остановить осуществление программы Java из Командной строки?

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

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

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

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

Какая-либо справка / советует?

8
задан danben 10 June 2010 в 12:05
поделиться

5 ответов

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

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

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-программу и возвращает управление при завершении. Мне было бы интересно узнать, есть ли у кого-нибудь решение для этого.

3
ответ дан 5 December 2019 в 20:14
поделиться

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

nohup java YourJavaClass &

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

kill [psIdofYourApplication]

или

fg [your application job Id]
Ctrl-C

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

или sun.misc.SignalHandler

3
ответ дан 5 December 2019 в 20:14
поделиться
ps ux

см. pid

kill pid

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

1
ответ дан 5 December 2019 в 20:14
поделиться

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

1
ответ дан 5 December 2019 в 20:14
поделиться

Насколько я понимаю, вам нужно что-то вроде этого:

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

Я прав?

0
ответ дан 5 December 2019 в 20:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: