Java ، التحقق مما إذا كان معرف العملية يعمل حاليًا على Windows
سؤال
هل من الممكن التحقق من وجود العملية من Java في Windows.
لديّ pid ممكن ، أريد أن أعرف ما إذا كان لا يزال قيد التشغيل أم لا.
المحلول
معرفة ما إذا كان هذا يمكن أن يساعد:
http://blogs.oracle.com/vaibhav/entry/listing_java_process_from_java
يشرح هذا المنشور كيفية تشغيل جميع PIDs على جهاز Windows: يجب عليك مقارنة إخراج cmd
اتصل بـ PID الخاص بك ، بدلاً من طباعته.
إذا كنت على أنظمة تشبه Unix التي يتعين عليك استخدامها ps
بدلاً من cmd
أوامر نظام الاتصال من رمز Java الخاص بك ليس حلاً محمولًا للغاية ؛ ثم مرة أخرى ، يختلف تنفيذ العمليات بين أنظمة التشغيل.
نصائح أخرى
كيفية التحقق مما إذا كان PID يعمل على Windows مع Java:
الأمر TaskList Windows:
أمر 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
للحصول على معلومات عن PID محددة:
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 قيد التشغيل.
إذا قمت بالاستعلام عن 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 () ؛