Java, comprobando si existe identificador de proceso se está ejecutando actualmente en Windows
Pregunta
¿Es posible comprobar la existencia de procesos de Java en Windows.
Tengo su posible PID, me gustaría saber si todavía está funcionando o no.
Solución
A ver si esto puede ayudar:
http://blogs.oracle.com/vaibhav/entry/listing_java_process_from_java
Ese puesto le explica cómo obtener todos los PID se ejecutan en una máquina Windows:. Tendría que comparar la salida de la llamada cmd
con su PID, en lugar de imprimirlo
Si está en Unix-como sistemas que tendría que utilizar con ps
en lugar de cmd
Llamar a los comandos del sistema a partir del código de Java no es una solución muy portátil; Por otra parte, la implementación de procesos varía entre los sistemas operativos.
Otros consejos
¿Cómo comprobar si un PID se ejecuta en Windows con Java:
Windows comando de lista de tareas:
Los comandos de DOS tasklist
muestra algunos de salida en qué procesos se están ejecutando:
C:\Documents and Settings\eric>tasklist
Image Name PID Session Name Session# Mem Usage
========================= ====== ================ ======== ============
System Idle Process 0 Console 0 28 K
System 4 Console 0 244 K
smss.exe 856 Console 0 436 K
csrss.exe 908 Console 0 6,556 K
winlogon.exe 932 Console 0 4,092 K
....
cmd.exe 3012 Console 0 2,860 K
tasklist.exe 5888 Console 0 5,008 K
C:\Documents and Settings\eric>
La segunda columna es el PID
Puede utilizar tasklist
para obtener información sobre un PID específico:
tasklist /FI "PID eq 1300"
impresiones:
Image Name PID Session Name Session# Mem Usage
========================= ====== ================ ======== ============
mysqld.exe 1300 Console 0 17,456 K
C:\Documents and Settings\eric>
Una respuesta significa que el PID se está ejecutando.
Si se consulta un PID que no existe, se obtiene lo siguiente:
C:\Documents and Settings\eric>tasklist /FI "PID eq 1301"
INFO: No tasks running with the specified criteria.
C:\Documents and Settings\eric>
Una función de Java podría hacer lo anterior de forma automática
Esta función sólo funcionará en sistemas Windows que tienen tasklist
disponible.
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
public class IsPidRunningTest {
public static void main(String[] args) {
//this function prints all running processes
showAllProcessesRunningOnWindows();
//this prints whether or not processID 1300 is running
System.out.println("is PID 1300 running? " +
isProcessIdRunningOnWindows(1300));
}
/**
* Queries {@code tasklist} if the process ID {@code pid} is running.
* @param pid the PID to check
* @return {@code true} if the PID is running, {@code false} otherwise
*/
public static boolean isProcessIdRunningOnWindows(int pid){
try {
Runtime runtime = Runtime.getRuntime();
String cmds[] = {"cmd", "/c", "tasklist /FI \"PID eq " + pid + "\""};
Process proc = runtime.exec(cmds);
InputStream inputstream = proc.getInputStream();
InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
String line;
while ((line = bufferedreader.readLine()) != null) {
//Search the PID matched lines single line for the sequence: " 1300 "
//if you find it, then the PID is still running.
if (line.contains(" " + pid + " ")){
return true;
}
}
return false;
} catch (Exception ex) {
ex.printStackTrace();
System.out.println("Cannot query the tasklist for some reason.");
System.exit(0);
}
return false;
}
/**
* Prints the output of {@code tasklist} including PIDs.
*/
public static void showAllProcessesRunningOnWindows(){
try {
Runtime runtime = Runtime.getRuntime();
String cmds[] = {"cmd", "/c", "tasklist"};
Process proc = runtime.exec(cmds);
InputStream inputstream = proc.getInputStream();
InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
String line;
while ((line = bufferedreader.readLine()) != null) {
System.out.println(line);
}
} catch (Exception ex) {
ex.printStackTrace();
System.out.println("Cannot query the tasklist for some reason.");
}
}
}
El código Java anterior Imprime una lista de todos los procesos que se ejecutan a continuación, imprime:
is PID 1300 running? true
Código:
boolean isStillAllive(String pidStr) {
String OS = System.getProperty("os.name").toLowerCase();
String command = null;
if (OS.indexOf("win") >= 0) {
log.debug("Check alive Windows mode. Pid: [{}]", pidStr);
command = "cmd /c tasklist /FI \"PID eq " + pidStr + "\"";
return isProcessIdRunning(pidStr, command);
} else if (OS.indexOf("nix") >= 0 || OS.indexOf("nux") >= 0) {
log.debug("Check alive Linux/Unix mode. Pid: [{}]", pidStr);
command = "ps -p " + pidStr;
return isProcessIdRunning(pidStr, command);
}
log.debug("Default Check alive for Pid: [{}] is false", pidStr);
return false;
}
boolean isProcessIdRunning(String pid, String command) {
log.debug("Command [{}]",command );
try {
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec(command);
InputStreamReader isReader = new InputStreamReader(pr.getInputStream());
BufferedReader bReader = new BufferedReader(isReader);
String strLine = null;
while ((strLine= bReader.readLine()) != null) {
if (strLine.contains(" " + pid + " ")) {
return true;
}
}
return false;
} catch (Exception ex) {
log.warn("Got exception using system command [{}].", command, ex);
return true;
}
}
- JNA importación de Maven para su proyecto
- después de Maven era de actualización que puede utilizar:
int myPid = Kernel32.INSTANCE.GetCurrentProcessId ();