Я начал программу Java из C# с помощьюблизко ява процесс от C# (на окнах)
...
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.WorkingDirectory = "C:\\path\\to\\jar\\";
startInfo.FileName = "C:\\Windows\\Sysnative\\java.exe";
startInfo.Arguments = "-jar JavaProg.jar";
process = new Process();
process.StartInfo = startInfo;
try {
process.Start();
}
...
Процесс затем работает непрерывно, пока я не хочу, чтобы это остановить. В java-программе есть крючок отключения, который должен улавливать нормальные сигналы уничтожения. Например, если я запустил банку из сценария летучей мыши, то нажатие Ctrl + c в окне cmd приведет к запуску крюка остановки, но закрытие окна cmd завершит процесс без запуска крюка выключения (аналогично End Process в диспетчере задач).
Так что для того, чтобы остановить программу Java от C# Я пробовал:
process.CloseMainWindow();
или
process.Kill();
Метод CloseMainWindow не оказывает никакого влияния на процесс Java, и убийство прекращает его без срабатывания выключение крюк. Итак, что я могу сделать, чтобы закрыть java-программу изящно из кода C#? [Мне нужно внести изменения в мою программу Java для перехвата сигнала CloseMainWindow? Есть ли способ имитировать поведение Ctrl + c в окне cmd из C#? Должен ли я создать некоторый путь связи между моими кодами C# и Java, такими как труба или гнездо?]
P.S. Код C# является просто оболочкой для Java-кода, чтобы запускать его как службу в Windows (я не могу использовать существующие инструменты, такие как RunAsService для этой цели).
Общее описание программы: Моя программа java не создает никаких окон. Он имеет несколько потоков, основной работает в цикле, только ожидая соединений, другой выполняет определенную задачу во входящем соединении, другой поток выполняет периодические обновления с веб-сервера, и есть крюк отключения. Обычно программа запускается из командной строки (или терминала на linux) и принимает пользовательский ввод только тогда, когда она загружается в первый раз, после чего ее можно запустить снова без ввода пользователя. Программа выводит журналы в файл. Мой крюк отключения:
...
shutdownHook = new ShutdownHook();
Runtime.getRuntime().addShutdownHook(shutdownHook);
...
class ShutdownHook extends Thread {
public void run() {
// log the shutdown is started
// terminate classes
// interrupt and join the other threads
// log the shutdown is done
}
}
Я сомневаюсь, что это не имеет ничего общего с Java. Или вы хотите сказать, что вы можете убить другие процессы таким образом без проблем? – fge
Как выглядит ваша Java-программа? Создает ли оно окно или запускает ли он в оболочке? – helb
Является ли запуск при запуске, если вы убиваете процесс с помощью TaskManager? – helb