J'ai besoin d'un moyen Java pour trouver un processus Win en cours d'exécution à partir duquel je sais nommer l'exécutable. Je veux vérifier s'il fonctionne actuellement et j'ai besoin d'un moyen de mettre fin au processus si je le trouvais.
Vous pouvez utiliser les outils de fenêtres de ligne de commande tasklist
et taskkill
et les appeler à partir de Java à l'aide de Runtime.exec()
.
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);
}
EXEMPLE:
public static void main(String args[]) throws Exception {
String processName = "WINWORD.EXE";
//System.out.print(isProcessRunning(processName));
if (isProcessRunning(processName)) {
killProcess(processName);
}
}
Il existe une petite API fournissant les fonctionnalités souhaitées:
https://github.com/kohsuke/winp
Bibliothèque de processus Windows
Vous pouvez utiliser un outil de ligne de commande pour tuer des processus tels que SysInternals PsKill et SysInternals PsList .
Vous pouvez également utiliser tasklist.exe et taskkill.exe intégrés, mais ceux-ci ne sont disponibles que sous Windows XP Professional et versions ultérieures (pas dans l'édition familiale).
Utilisez Java.lang.Runtime.exec pour exécuter le programme.
Voici une façon géniale de le faire:
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}")
}
Utilisez la classe suivante pour tuer un processus Windows ( s'il est en cours d'exécution ). J'utilise l'argument de ligne de commande force /F
pour m'assurer que le processus spécifié par l'argument /IM
sera terminé.
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();
}
}
petit changement de réponse écrit par Super Kakes
private static final String KILL = "taskkill /IMF ";
Changé en ..
private static final String KILL = "taskkill /IM ";
L'option /IMF
ne fonctionne pas. Elle ne tue pas le bloc-notes..pendant que l'option /IM
fonctionne réellement
Vous devrez appeler du code natif, car IMHO il n'y a pas de bibliothèque qui le fait. Comme JNI est lourd et difficile, vous pouvez essayer d’utiliser JNA (Java Native Access). https://jna.dev.Java.net/