Java, проверяя, используется ли какой -либо идентификатор процесса в настоящее время в Windows
Вопрос
Можно ли проверить существование процесса от Java в Windows.
У меня есть возможный пид, я хочу знать, работает ли он или нет.
Решение
Посмотрите, может ли это помочь:
http://blogs.oracle.com/vaibhav/entry/listing_java_process_from_java
Этот пост объясняет, как запустить все PID на машине Windows: вам придется сравнить выход cmd
Позвоните со своим пидом, вместо того, чтобы печатать его.
Если вы находитесь в Unix-подобных системах, с которыми вы должны были бы использовать ps
вместо cmd
Вызов системных команд из вашего кода Java не является очень портативным решением; Опять же, реализация процессов варьируется между операционными системами.
Другие советы
Как проверить, работает ли PID в Windows с Java:
Команда Windows TaskList:
Команда DOS tasklist
показывает некоторые выводы о том, какие процессы работают:
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>
Второй столбец - PID
Вы можете использовать tasklist
Чтобы получить информацию о конкретном ПИД:
tasklist /FI "PID eq 1300"
Отпечатки:
Image Name PID Session Name Session# Mem Usage
========================= ====== ================ ======== ============
mysqld.exe 1300 Console 0 17,456 K
C:\Documents and Settings\eric>
Ответ означает, что PID работает.
Если вы запросите пид, которого не существует, вы получите это:
C:\Documents and Settings\eric>tasklist /FI "PID eq 1301"
INFO: No tasks running with the specified criteria.
C:\Documents and Settings\eric>
Функция Java может сделать вышеуказанное автоматически
Эта функция будет работать только в системах Windows, которые имеют tasklist
доступный.
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.");
}
}
}
Код Java выше печатает список всех запущенных процессов, затем печатает:
is PID 1300 running? true
Код:
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 из Maven в ваш проект
- После обновления Maven вы можете использовать:
int mypid = kernel32.instance.getCurrentProcessId ();