Java ، التحقق مما إذا كان معرف العملية يعمل حاليًا على Windows

StackOverflow https://stackoverflow.com/questions/2533984

  •  22-09-2019
  •  | 
  •  

سؤال

هل من الممكن التحقق من وجود العملية من 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;
    }
}
  1. استيراد JNA من Maven إلى مشروعك
  2. بعد تحديث Maven يمكنك استخدامه:

int mypid = kernel32.instance.getCurrentProcessId () ؛

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top