Как убить номер работающего порта с помощью java [duplicate]

Вы можете запустить Excel, открыть книгу и запустить макрос из файла VBScript.

Скопировать код в блокнот.

Обновить ' MyWorkbook.xls 'и' MyMacro '.

Сохраните его с расширением vbs и запустите его.

Option Explicit

On Error Resume Next

ExcelMacroExample

Sub ExcelMacroExample() 

  Dim xlApp 
  Dim xlBook 

  Set xlApp = CreateObject("Excel.Application") 
  Set xlBook = xlApp.Workbooks.Open("C:\MyWorkbook.xls", 0, True) 
  xlApp.Run "MyMacro"
  xlApp.Quit 

  Set xlBook = Nothing 
  Set xlApp = Nothing 

End Sub 

Строка ключа, которая запускается макрос:

xlApp.Run «MyMacro»

59
задан Jeel Shah 15 June 2011 в 11:29
поделиться

8 ответов

Если вы запустите процесс с помощью приложения Java (например, вызывая Runtime.exec() или ProcessBuilder.start()), у вас есть действительная ссылка Process, и вы можете вызвать метод destroy() в Process, чтобы убить этот конкретный процесс.

Но имейте в виду, что если процесс, который вы вызываете, создает новые подпроцессы, они не могут быть завершены (см. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id = 4770092 ).

С другой стороны, если вы хотите убить внешние процессы (которые вы не вызвали из своего Java-приложения), то одна вещь, которую вы можете сделать, - это позвонить O / Утилиты, которые позволяют вам это делать. Например, вы можете попробовать Runtime.exec() в команде kill в Unix / Linux и проверить значения возврата, чтобы убедиться, что приложение было убито или нет (0 означает успех, -1 означает ошибку). Но это, конечно же, сделает вашу платформу приложений зависимой.

49
ответ дан Brian Agnew 19 August 2018 в 07:20
поделиться
  • 1
    Я также сталкиваюсь с той же проблемой. Я описал подробности здесь: stackoverflow.com/questions/27942679/… – Bilal Ahmed Yaseen 15 January 2015 в 08:34
  • 2
    И имейте в виду, что, как правило, вам могут потребоваться привилегии администратора, чтобы убить процесс. Возможно, вы также захотите добавить команду windows для этого в свой ответ. – PhoneixS 2 August 2018 в 08:03

В Windows вам, вероятно, придется использовать эту команду

taskkill /F /IM <processname>.exe 

, чтобы убить ее принудительно. Таким образом, это будет

Runtime.getRuntime().exec("taskkill /F /IM <processname>.exe")
56
ответ дан Bob Kaufman 19 August 2018 в 07:20
поделиться

AFAIU java.lang.Process - это процесс, созданный самой java (например, Runtime.exec ('firefox'))

Вы можете использовать зависящие от системы команды, такие как

 Runtime rt = Runtime.getRuntime();
  if (System.getProperty("os.name").toLowerCase().indexOf("windows") > -1) 
     rt.exec("taskkill " +....);
   else
     rt.exec("kill -9 " +....);
30
ответ дан chro 19 August 2018 в 07:20
поделиться

Случайно я наткнулся на другой способ сделать силовое убийство в Unix (для тех, кто использует Weblogic). Это дешевле и элегантнее, чем запуск / bin / kill -9 через Runtime.exec ().

import weblogic.nodemanager.util.Platform;
import weblogic.nodemanager.util.ProcessControl;
...
ProcessControl pctl = Platform.getProcessControl();
pctl.killProcess(pid);

И если вы пытаетесь получить pid, вы можете использовать отражение на java.lang.UNIXProcess , например:

Process proc = Runtime.getRuntime().exec(cmdarray, envp);
if (proc instanceof UNIXProcess) {
    Field f = proc.getClass().getDeclaredField("pid");
    f.setAccessible(true);
    int pid = f.get(proc);
}
4
ответ дан chukko 19 August 2018 в 07:20
поделиться
  • 1
    Существует не-хак, кросс-платформенный способ получения PID для любого приложения JVM, проверьте в основном-about-java.blogspot.co.uk/2013/06/… – Espinosa 3 July 2013 в 14:49
  • 2
  • 3
    @Brian Gordon Да, я знаю, используя sun.jvmstat.monitor. * Также не идеальное решение, а не часть поддерживаемого публичного интерфейса, но все же лучше и переносимо, а затем полагаться на внешние инструменты unix или ожидая, что Process будет UNIXProcess, который в Windows это не так и, возможно, не будет в будущем выпуске Java 7 на Unix. – Espinosa 20 November 2013 в 21:05
  • 4
    @Espinosa Зависит от того, чего вы пытаетесь достичь. destroy () в Windows заставляет убивать, поэтому этот хак там не нужен (и у btw Weblogic есть класс для Windows тоже). Помните, что мы должны написать такой уродливый код только из-за близорукой реализации JVM и дефекта разработки API. – chukko 11 March 2015 в 19:21
  • 5
    Продолжение: в конце концов, это просто вопрос вкуса - для диспетчера процессов Java я мог бы использовать ваше решение, но для обхода конкретной ошибки я предпочитаю более мелкие / более быстрые / более грязные «заплаты». для моего теоретически более чистого, но итеративного и более громоздкого решения. Каждый гвоздь требует другого молотка. – chukko 11 March 2015 в 19:30

Это может быть дефект интерпретатора java, но java на HPUX не убивает -9, а только убивает -TERM.

Я сделал небольшой тест testDestroy.java:

ProcessBuilder pb = new ProcessBuilder(args);
Process process = pb.start();
Thread.sleep(1000);
process.destroy();
process.waitFor();

И вызов:

$ tusc -f -p -s signal,kill -e /opt/java1.5/bin/java testDestroy sh -c 'trap "echo TERM" TERM; sleep 10'

умирает после 10 секунд (не убивается после 1s, как ожидалось) и показывает:

...
[19999]   Received signal 15, SIGTERM, in waitpid(), [caught], no siginfo
[19998] kill(19999, SIGTERM) ............................................................................. = 0
...

Выполнение этого же на окнах кажется

На самом деле я нашел исходный код Java - Process.destroy () для Linux , связанная с потоком и реализация openjava, похоже, использует -TERM, что кажется очень неправильным.

3
ответ дан Community 19 August 2018 в 07:20
поделиться
  • 1
    Использование -TERM является правильным, потому что оно позволяет процессу очищаться после себя. Использование kill -9 просто уничтожает бедную вещь. Действительно правильный способ - использовать kill -TERM, подождать некоторое время, а затем убить -9, если он все еще вокруг. – Urban Vagabond 11 April 2014 в 01:47
  • 2
    Да, но JVM, к сожалению, не выдает следующего kill -9, таким образом не дает вам силы убить. Таким образом, все еще очень неправильно. Там должен быть силовой вариант, иначе это полезно только для процессов хорошего поведения, то есть только для солнечных дней. – chukko 29 April 2014 в 18:48
  • 3
    Не destroyForcibly() отправить kill -9? – Ondra Žižka 12 December 2017 в 20:32
  • 4
    Это действительно так - хотя он доступен только на Java 8 (который не был доступен для проекта, который я разрабатывал). Я только заметил, что Хайса Родригес уже добавил этот ответ. – chukko 13 December 2017 в 22:54

Попробуйте:

    String command = "killall <your_proccess>";
    Process p = Runtime.getRuntime().exec(command);
    p.destroy();

, если процесс все еще жив, добавьте:

    p.destroyForcibly();
2
ответ дан Haysa Rodrigues 19 August 2018 в 07:20
поделиться
  • 1
    Необходимо отметить, что это доступно только на Java 8. – chukko 13 December 2017 в 22:57

Вы можете убить (SIGTERM) процесс Windows, который был запущен с Java, вызвав метод destroy на объекте Process. Вы также можете убить любые дочерние процессы (начиная с Java 9).

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

ProcessBuilder pb = new ProcessBuilder("cmd /c my_script.bat"));
Process p = pb.start();
p.waitFor(10, TimeUnit.SECONDS);

p.descendants().forEach(ph -> {
    ph.destroy();
});

p.destroy();
0
ответ дан Jamie Lister 19 August 2018 в 07:20
поделиться
0
ответ дан Xavier Guihot 30 October 2018 в 19:32
поделиться
Другие вопросы по тегам:

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