Как прекратить Java-приложение из службы C # - PullRequest
2 голосов
/ 13 февраля 2012

Я пытаюсь разработать службу C # Watchdog для файла журнала, чтобы перезапустить приложение Java.

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

Я хочу, чтобы моя служба C # отслеживала, обновляется ли файл журнала новыми данными.Если он не получает новые данные, я хочу перезапустить приложение Java.

Я нашел в Интернете материал о вызове пакетных сценариев в приложениях C # и проверке изменения файлов, но мне было интересно, если этоспособ завершить в настоящее время запущенную программу Java с помощью приложения C #?Java-программы называются javaw.exe, но это другие Java-программы, работающие на этом компьютере, поэтому они не уникальны.У кого-нибудь есть идеи, как этого добиться?

Ответы [ 2 ]

4 голосов
/ 05 марта 2012

jps -v - это команда Java, которая детализирует процессы, которые используются в Java.Если вы сделаете этот вызов через c # и передадите информацию в строку, вы можете разобраться в этом и точно определить, какой процесс вы хотите убить.

Вы можете получить вывод следующим образом:

        ProcessStartInfo psi = new ProcessStartInfo("jps", "-v");
        psi.RedirectStandardOutput = true;
        psi.UseShellExecute = false;
        Process p = new Process();
        p.StartInfo = psi;
        p.Start();
        string[] output = p.StandardOutput.ReadToEnd().Split("\n".ToCharArray());

После этого вы можете легко проанализировать идентификатор процесса и имя процесса Java, который вы запускаете.

2 голосов
/ 13 февраля 2012

Хорошей практикой является корректное завершение программ, то есть отправка какого-то сигнала, который вежливо просит программу завершиться.Если вы работаете в чистой среде Java, я бы порекомендовал вам использовать для этого JMX, но, поскольку ваш сторожевой таймер находится в C #, вы можете отправлять сигнал, используя обычные сокеты TCP.Этот способ хорош, если вы можете изменить программу Java, чтобы иметь возможность получать такой сигнал.

Чтобы убить любой процесс, который вы можете использовать либо killtask команда, либо C # API, который убивает процесс, идентифицируемый PID.Это не тривиальная задача - найти PID запущенного Java-процесса в Windows.Но вы можете использовать команду jps, которая печатает все процессы Java с их именами и аргументами основного класса.

Вы можете передать специальный идентификатор вашей Java-программе, используя опцию -D: java -Dmyid=1234 MyClass arg1 arg2

Сохранить 1234 (myid) в программе C #.Затем, когда вы захотите проверить, работает ли java-программа, выполните jps, проанализируйте ее вывод, получите процесс с параметром -Dmyid=1234, получите его PID, возвращаемый jps, и завершите процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...