Potrzebuję metody Java, aby znaleźć działający proces Win, od którego znam nazwę pliku wykonywalnego. Chcę sprawdzić, czy działa teraz i potrzebuję sposobu na zabicie procesu, jeśli go znajdę.Jak znaleźć i zabić uruchamianie Win-Processes z poziomu Java?
Odpowiedz
Możesz użyć narzędzi Windows na linii poleceń tasklist
i taskkill
i wywoływać je z poziomu Javy przy użyciu Runtime.exec()
.
Będziesz musiał zadzwonić do natywnego kodu, ponieważ IMHO nie ma biblioteki, która to robi. Ponieważ JNI jest kłopotliwy i trudny, możesz spróbować użyć JNA (Java Native Access). https://jna.dev.java.net/
Można użyć narzędzia wiersza poleceń do zabijania procesów, takich jak SysInternals PsKill i SysInternals PsList.
Można również użyć wbudowanych tasklist.exe i taskkill.exe, ale są one dostępne tylko w systemie Windows XP Professional i nowszych wersjach (nie w wersji Home Edition).
Użyj java.lang.Runtime.exec, aby uruchomić program.
Jest trochę API zapewniając pożądaną funkcjonalność:
https://github.com/kohsuke/winp
Biblioteka procesów systemu Windows
private static final String TASKLIST = "tasklist";
private static final String KILL = "taskkill /F /IM ";
public static boolean isProcessRunning(String serviceName) throws Exception {
Process p = Runtime.getRuntime().exec(TASKLIST);
BufferedReader reader = new BufferedReader(new InputStreamReader(
p.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
if (line.contains(serviceName)) {
return true;
}
}
return false;
}
public static void killProcess(String serviceName) throws Exception {
Runtime.getRuntime().exec(KILL + serviceName);
}
PRZYKŁAD:
public static void main(String args[]) throws Exception {
String processName = "WINWORD.EXE";
//System.out.print(isProcessRunning(processName));
if (isProcessRunning(processName)) {
killProcess(processName);
}
}
Jeśli taskkill nie zakończy twojego procesu, możesz dodać parametr "/ F", aby go wymusić. –
wygląda dobrze! Nie wiedziałem, że to jest ważna opcja tutaj. Zaktualizowałem odpowiedź. Thanx –
minus 1, ponieważ polecenie taskkill ma niepoprawną składnię. Powinien to być "" taskkill/F/IM "' – BullyWiiPlaza
Oto Groovy sposób to zrobić:
final Process jpsProcess = "cmd /c jps".execute()
final BufferedReader reader = new BufferedReader(new InputStreamReader(jpsProcess.getInputStream()));
def jarFileName = "FileName.jar"
def processId = null
reader.eachLine {
if (it.contains(jarFileName)) {
def args = it.split(" ")
if (processId != null) {
throw new IllegalStateException("Multiple processes found executing ${jarFileName} ids: ${processId} and ${args[0]}")
} else {
processId = args[0]
}
}
}
if (processId != null) {
def killCommand = "cmd /c TASKKILL /F /PID ${processId}"
def killProcess = killCommand.execute()
def stdout = new StringBuilder()
def stderr = new StringBuilder()
killProcess.consumeProcessOutput(stdout, stderr)
println(killCommand)
def errorOutput = stderr.toString()
if (!errorOutput.empty) {
println(errorOutput)
}
def stdOutput = stdout.toString()
if (!stdOutput.empty) {
println(stdOutput)
}
killProcess.waitFor()
} else {
System.err.println("Could not find process for jar ${jarFileName}")
}
mała zmiana w odpowiedzi pisemnej przez Super Kakes
private static final String KILL = "taskkill /IMF ";
Zmieniono ..
private static final String KILL = "taskkill /IM ";
/IMF
opcja doesnot pracy .To nie zabija notepad..while /IM
opcja faktycznie działa
Użyj następującej klasy do kill a Windows process (if it is running). Używam argumentu force command line /F
, aby upewnić się, że proces określony w argumencie /IM
zostanie zakończony.
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class WindowsProcess
{
private String processName;
public WindowsProcess(String processName)
{
this.processName = processName;
}
public void kill() throws Exception
{
if (isRunning())
{
getRuntime().exec("taskkill /F /IM " + processName);
}
}
private boolean isRunning() throws Exception
{
Process listTasksProcess = getRuntime().exec("tasklist");
BufferedReader tasksListReader = new BufferedReader(
new InputStreamReader(listTasksProcess.getInputStream()));
String tasksLine;
while ((tasksLine = tasksListReader.readLine()) != null)
{
if (tasksLine.contains(processName))
{
return true;
}
}
return false;
}
private Runtime getRuntime()
{
return Runtime.getRuntime();
}
}
- 1. Uruchamianie hello.py z poziomu procesu Android
- 2. R z poziomu Java
- 3. Uruchamianie MySQL z poziomu wiersza poleceń
- 4. Jak włączać i wyłączać monitor z poziomu aplikacji Java?
- 5. Jak ustawić umask z poziomu java?
- 6. Uruchamianie aplikacji java z innej aplikacji java
- 7. Kompilowanie zewnętrznych plików .java z poziomu Java
- 8. Uruchamianie programu java z innego programu java
- 9. Jaki jest najlepszy sposób zarządzania procesem uniksowym z poziomu java?
- 10. Jak zabić proces z WiX
- 11. Uruchamianie Pythona interaktywnie z poziomu Sublime Text 2
- 12. Jak uzyskać procent wykorzystania procesora systemu operacyjnego z poziomu java
- 13. Jak znaleźć katalog skryptu uruchamiającego Python z poziomu skryptu?
- 14. Inteligentne uruchamianie domyślnego edytora z poziomu programu Python CLI?
- 15. Uruchamianie aplikacji Java jako usługi
- 16. Uruchamianie archiwum słoików w działającej aplikacji Java
- 17. Uruchamianie scrapy z poziomu skryptu Python - eksporter CSV nie działa
- 18. Skanowanie sprzętowe skanowania obrazów z poziomu Java
- 19. Otwieranie dowolnego pliku z poziomu programu java
- 20. Uruchamianie aplikacji Apple Mail z poziomu mojej aplikacji?
- 21. jak znaleźć klasy Java?
- 22. Jak zabić proces nohup?
- 23. Jak zabić połączenia MySQL
- 24. Dostęp do Gmaila z poziomu Java
- 25. jak zabić proces uWSGI
- 26. jak zabić dziecko widelca?
- 27. jak zabić proces i procesy potomne z Pythona?
- 28. Jak zabić proces C#?
- 29. Jak zabić wątek MFC?
- 30. Jak zabić instancję CodeMirror?
Czy istnieje dobry URL tego interfejsu API? – dumbledad
naprawiono link. – andreas
Naprawiono link ponownie –