जावा के साथ वर्तमान खुली खिड़कियों / प्रक्रिया की सूची कैसे प्राप्त करें?


95

क्या किसी को पता है कि मुझे जावा का उपयोग करके वर्तमान खुली खिड़कियां या स्थानीय मशीन की प्रक्रिया कैसे मिलती है?

मैं जो करने की कोशिश कर रहा हूं वह यह है: विंडोज टास्कमैनजर की तरह वर्तमान खुले कार्य, विंडोज या प्रक्रिया को खोलें, लेकिन एक बहु-मंच दृष्टिकोण का उपयोग करना - यदि संभव हो तो केवल जावा का उपयोग करना।

जवाबों:


105

यह " ps -e " कमांड से प्रक्रिया सूची को पार्स करने का एक और तरीका है :

try {
    String line;
    Process p = Runtime.getRuntime().exec("ps -e");
    BufferedReader input =
            new BufferedReader(new InputStreamReader(p.getInputStream()));
    while ((line = input.readLine()) != null) {
        System.out.println(line); //<-- Parse data here.
    }
    input.close();
} catch (Exception err) {
    err.printStackTrace();
}

यदि आप Windows का उपयोग कर रहे हैं, तो आपको लाइन बदलनी चाहिए: "प्रोसेस p = Runtime.getRun ..." आदि ... (3rd लाइन), एक के लिए जो इस तरह दिखता है:

Process p = Runtime.getRuntime().exec
    (System.getenv("windir") +"\\system32\\"+"tasklist.exe");

आशा है कि जानकारी मदद करती है!


कैसे प्रक्रिया शुरू करने के लिए समय और अंत समय मिलता है
रुपये

34
विंडोज पर, tasklist.exe /fo csv /nhसीएसवी प्रारूप में सूची प्राप्त करने के लिए चलाएं , इससे पार्स करना बहुत आसान है।
इमैनुएल बॉर्ग

लेकिन यह जार नाम नहीं दिखा रहा है। मेरा निष्पादन योग्य जार नाम helloDemo.jar है। लेकिन यह इसके लिए कुछ भी नहीं दिखा रहा है
सुमन बप्पी

अगर मैं जोड़ूँ तो यह काम क्यों नहीं करेगा | ग्रेप जावा? यानी ps -elf | grep javaएक चीज़ वापस नहीं करेगा, लेकिन ps -elfउम्मीद के मुताबिक काम करेगा।
इते मूव -मालिमोवका

यह ध्यान दिया जाना चाहिए कि नीचे स्थित "विंडोज़ विशिष्ट" बिट अनावश्यक प्रतीत होता है। विंडोज 10 पर, (.exec (Runtime/getRuntime) "tasklist"))(क्लोजर में, जावा-इंटरॉप का उपयोग करके) tasklistएक निर्देशिका को निर्दिष्ट किए बिना, प्रक्रिया को सही ढंग से वापस करता है।
१c:

39

अंत में, जावा 9+ के साथ यह संभव है ProcessHandle:

public static void main(String[] args) {
    ProcessHandle.allProcesses()
            .forEach(process -> System.out.println(processDetails(process)));
}

private static String processDetails(ProcessHandle process) {
    return String.format("%8d %8s %10s %26s %-40s",
            process.pid(),
            text(process.parent().map(ProcessHandle::pid)),
            text(process.info().user()),
            text(process.info().startInstant()),
            text(process.info().commandLine()));
}

private static String text(Optional<?> optional) {
    return optional.map(Object::toString).orElse("-");
}

आउटपुट:

    1        -       root   2017-11-19T18:01:13.100Z /sbin/init
  ...
  639     1325   www-data   2018-12-04T06:35:58.680Z /usr/sbin/apache2 -k start
  ...
23082    11054    huguesm   2018-12-04T10:24:22.100Z /.../java ProcessListDemo

प्रोसेसहैंडल के साथ काम करने के लिए कौन सा आयात जोड़ा जाना चाहिए?
जोर्डी

2
उस वर्ग को java.langकिसी आयात की आवश्यकता नहीं है
ह्यूजेस एम।

23

विंडोज पर JNA का उपयोग कर एक विकल्प है :

import com.sun.jna.Native;
import com.sun.jna.platform.win32.*;
import com.sun.jna.win32.W32APIOptions;

public class ProcessList {

    public static void main(String[] args) {
        WinNT winNT = (WinNT) Native.loadLibrary(WinNT.class, W32APIOptions.UNICODE_OPTIONS);

        WinNT.HANDLE snapshot = winNT.CreateToolhelp32Snapshot(Tlhelp32.TH32CS_SNAPPROCESS, new WinDef.DWORD(0));

        Tlhelp32.PROCESSENTRY32.ByReference processEntry = new Tlhelp32.PROCESSENTRY32.ByReference();

        while (winNT.Process32Next(snapshot, processEntry)) {
            System.out.println(processEntry.th32ProcessID + "\t" + Native.toString(processEntry.szExeFile));
        }

        winNT.CloseHandle(snapshot);
    }
}

यह केवल कमांड का नाम देता है न कि पूरी कमांड लाइन। क्या पूरी कमांड लाइन पाने का कोई तरीका है?
क्रिस्टोफर डैंसी

2
आप कॉल करके पूरा रास्ता पा सकते हैं GetModuleFileName। उदाहरण के लिए stackoverflow.com/questions/7521693/… देखें ।
इमैनुएल बोबर्ग

एकमात्र समस्या w / यह है कि यह केवल प्रक्रिया का पथ देता है संपूर्ण कमांड लाइन नहीं। क्या प्रक्रिया का पूरा कमांड लाइन प्राप्त करने का एक तरीका है (यानी 'ant.bat -f helloWorld.ext')?
क्रिस्टोफर डैंसी

कैसे xyz.exe की तरह एक विशेष प्रक्रिया के लिए जाँच करने के लिए चल रहा है या नहीं?
अनजान

@ChristopherDancy सुनिश्चित नहीं है कि आपको अभी भी एक उत्तर की आवश्यकता है, लेकिन पूर्णता के लिए और जैसा कि यहाँ भी उल्लेख नहीं किया गया है: विनोद्व्स मैनेजमेंट इंफॉर्मेशन कमांड-लाइन (या बस wmic.exe) रनिंग एप्लिकेशन की भरपूर जानकारी प्राप्त करने का एक तरीका प्रदान करती है WMIC PROCESSया एक विशिष्ट प्रक्रिया के लिए उत्पादन को प्रतिबंधित करने के लिए WMIC PROCESS WHERE name='theName':। जरूरत पड़ने पर आउटपुट को सीमित करने के लिए आप आगे के फिल्टर का उपयोग कर सकते हैं। कमांड लाइन तालिका के
कमांडलाइन

9

जिस तरह से मैं यह करने के बारे में सोच सकता हूं वह एक कमांड लाइन एप्लिकेशन को लागू करने से है जो आपके लिए काम करता है और फिर आउटपुट स्क्रीनस्क्रीनिंग करता है (जैसे लिनक्स का पीएस और विंडो की टास्कलिस्ट)।

दुर्भाग्य से, इसका मतलब है कि आपको दोनों से डेटा पढ़ने के लिए कुछ पार्सिंग दिनचर्या लिखनी होगी।

Process proc = Runtime.getRuntime().exec ("tasklist.exe");
InputStream procOutput = proc.getInputStream ();
if (0 == proc.waitFor ()) {
    // TODO scan the procOutput for your data
}

1
हां, मैंने पहले से ही इसके बारे में भी सोचा था, लेकिन मुझे लगता है कि यह केवल जावा के साथ किया जा सकता है। और मुझे लगता है कि मैं शीर्ष के बजाय "ps -aux" का उपयोग करना बेहतर होगा। त्वरित उत्तर के लिए धन्यवाद!
रामायक १०’०१

विंडोज पर, tasklistप्रोग्राम को आउटपुट के लिए कॉन्फ़िगर किया जा सकता है CSV :)
MauganRa

7

YAJSW (फिर भी एक और जावा सेवा आवरण) ऐसा लगता है कि इसमें win32, linux, bsd और Solaris के लिए इसके org.rzo.yajsw.os.TaskList इंटरफ़ेस का JNA- आधारित कार्यान्वयन है और एक LGPL लाइसेंस के तहत है। मैंने इस कोड को सीधे कॉल करने की कोशिश नहीं की है, लेकिन जब मैंने इसे अतीत में उपयोग किया है, तो YAJSW वास्तव में अच्छी तरह से काम करता है, इसलिए आपको बहुत अधिक चिंताएं नहीं होनी चाहिए।


जाहिरा तौर पर v12 + अपाचे / LGPL दोहरे लाइसेंस है
harschware

5

आप jProcesses का उपयोग करके चल रही प्रक्रियाओं की सूची आसानी से प्राप्त कर सकते हैं

List<ProcessInfo> processesList = JProcesses.getProcessList();

for (final ProcessInfo processInfo : processesList) {
    System.out.println("Process PID: " + processInfo.getPid());
    System.out.println("Process Name: " + processInfo.getName());
    System.out.println("Process Used Time: " + processInfo.getTime());
    System.out.println("Full command: " + processInfo.getCommand());
    System.out.println("------------------");
}

इस पुस्तकालय (बहुत धीमी गति से हो रहा है ... इस के लिए एक कारण है या यह vbs भर में सामान्य जावा + WMI इंटरॉप है?
Gobliins

2
मुझे लगता है कि आप खिड़कियों के कार्यान्वयन के बारे में बात करते हैं। हां, आमतौर पर WMI के प्रश्नों में थोड़ा समय लगता है। हमेशा की तरह यह उपयोग के मामले पर निर्भर करता है। यदि आपको प्रत्येक 10 एमएस में क्वेरी करने की आवश्यकता है, तो हाँ, यह बहुत धीमा है।
profesor_falken

हाँ, मैं जीत के बारे में बात कर रहा था, linux में मैंने "ps ... <विकल्प>" का उपयोग किया था, इसलिए मुझे लगता है कि यह बहुत तेज़ होना चाहिए
Gobliins

ठीक है, अगर आप चाहते हैं कि आप गितुब परियोजना में एक मुद्दा बना सकते हैं और मैं अंततः एक नज़र डालूंगा और देखूंगा कि क्या मैं विन में प्रदर्शन में सुधार कर सकता हूं। वास्तव में मैंने इसे लिनक्स पर इस्तेमाल किया था इसलिए मैंने कार्यान्वयन को जीतने के लिए ज्यादा ध्यान नहीं दिया: -S
profesor_falken

यह ठीक है, लेकिन मैं क्या देख रहा था: आपकी प्रक्रिया startTime में आपने एक दिन के लिए दिए गए समय को सीमित कर दिया है (hh: mm: ss) अगर मैं गलत नहीं हूं। क्या तारीख + समय (yyyy-mm-dd-hh: mm: ss) पाने का कोई विकल्प है?
गोबलींस

4

ऐसा करने का कोई प्लेटफ़ॉर्म-न्यूट्रल तरीका नहीं है। जावा के 1.6 रिलीज में, एक " डेस्कटॉप " वर्ग को ब्राउज़ करने, संपादन, मेलिंग, खोलने, और आरआरआई के मुद्रण के पोर्टेबल तरीकों की अनुमति दी गई थी। यह संभव है कि यह वर्ग किसी दिन प्रक्रियाओं का समर्थन करने के लिए बढ़ाया जा सकता है, लेकिन मुझे संदेह है।

यदि आप जावा प्रक्रियाओं में केवल उत्सुक हैं, तो आप JVM पर थ्रेड / मेमोरी जानकारी प्राप्त करने के लिए java.lang.management एपीआई का उपयोग कर सकते हैं ।


4

उन विंडो के लिए जिनका मैं उपयोग कर रहा हूं:

Process process = new ProcessBuilder("tasklist.exe", "/fo", "csv", "/nh").start();
new Thread(() -> {
    Scanner sc = new Scanner(process.getInputStream());
    if (sc.hasNextLine()) sc.nextLine();
    while (sc.hasNextLine()) {
        String line = sc.nextLine();
        String[] parts = line.split(",");
        String unq = parts[0].substring(1).replaceFirst(".$", "");
        String pid = parts[1].substring(1).replaceFirst(".$", "");
        System.out.println(unq + " " + pid);
    }
}).start();
process.waitFor();
System.out.println("Done");

4

यह बंडल JRE वाले एप्लिकेशन के लिए उपयोगी हो सकता है: मैं उस फ़ोल्डर के नाम के लिए स्कैन करता हूं जो कि मैं एप्लिकेशन चला रहा हूं: इसलिए यदि आप एप्लिकेशन से निष्पादित कर रहे हैं:

C:\Dev\build\SomeJavaApp\jre-9.0.1\bin\javaw.exe

तब आप पा सकते हैं कि क्या यह पहले से ही J9 में चल रहा है,

public static void main(String[] args) {
    AtomicBoolean isRunning = new AtomicBoolean(false);
    ProcessHandle.allProcesses()
            .filter(ph -> ph.info().command().isPresent() && ph.info().command().get().contains("SomeJavaApp"))
            .forEach((process) -> {
                isRunning.set(true);
            });
    if (isRunning.get()) System.out.println("SomeJavaApp is running already");
}

3

ps auxलिनक्स के लिए और tasklistखिड़कियों के लिए पार्स के लिए कोड का उपयोग करना आपके सबसे अच्छे विकल्प हैं, जब तक कि कुछ और सामान्य नहीं आता है।

खिड़कियों के लिए, आप संदर्भ दे सकते हैं: http://www.rgagnon.com/javadetails/java-0593.html

लिनक्स के ps auxमाध्यम से grepभी परिणाम पाइप कर सकते हैं, जो प्रसंस्करण / त्वरित और आसान खोज करेगा। मुझे यकीन है कि आप खिड़कियों के लिए भी कुछ ऐसा ही पा सकते हैं।


: आप और अधिक विस्तार में कार्यसूची में भी देखने के लिए चाहते हो सकता है technet.microsoft.com/en-us/library/bb491010.aspx
जेम्स Oravec

2

नीचे दिए गए कार्यक्रम केवल जावा 9+ संस्करण के साथ संगत होंगे ...

वर्तमान जानकारी प्राप्त करने के लिए,

public class CurrentProcess {
    public static void main(String[] args) {
        ProcessHandle handle = ProcessHandle.current();
        System.out.println("Current Running Process Id: "+handle.pid());
        ProcessHandle.Info info = handle.info();
        System.out.println("ProcessHandle.Info : "+info);
    }
}

सभी चल रही प्रक्रियाओं के लिए,

import java.util.List;
import java.util.stream.Collectors;

public class AllProcesses {
    public static void main(String[] args) {
        ProcessHandle.allProcesses().forEach(processHandle -> {
            System.out.println(processHandle.pid()+" "+processHandle.info());
        });
    }
}

2

    String line;
    Process process = Runtime.getRuntime().exec("ps -e");
    process.getOutputStream().close();
    BufferedReader input =
            new BufferedReader(new InputStreamReader(process.getInputStream()));
    while ((line = input.readLine()) != null) {
        System.out.println(line); //<-- Parse data here.
    }
    input.close();

हमें इसका उपयोग process.getOutputStream.close()करना होगा अन्यथा यह लूप में बंद हो जाएगा।


0
package com.vipul;

import java.applet.Applet;
import java.awt.Checkbox;
import java.awt.Choice;
import java.awt.Font;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class BatchExecuteService extends Applet {
    public Choice choice;

    public void init() 
    {
        setFont(new Font("Helvetica", Font.BOLD, 36));
        choice = new Choice();
    }

    public static void main(String[] args) {
        BatchExecuteService batchExecuteService = new BatchExecuteService();
        batchExecuteService.run();
    }

    List<String> processList = new ArrayList<String>();

    public void run() {
        try {
            Runtime runtime = Runtime.getRuntime();
            Process process = runtime.exec("D:\\server.bat");
            process.getOutputStream().close();
            InputStream inputStream = process.getInputStream();
            InputStreamReader inputstreamreader = new InputStreamReader(
                    inputStream);
            BufferedReader bufferedrReader = new BufferedReader(
                    inputstreamreader);
            BufferedReader bufferedrReader1 = new BufferedReader(
                    inputstreamreader);

            String strLine = "";
            String x[]=new String[100];
            int i=0;
            int t=0;
            while ((strLine = bufferedrReader.readLine()) != null) 
            {
        //      System.out.println(strLine);
                String[] a=strLine.split(",");
                x[i++]=a[0];
            }
    //      System.out.println("Length : "+i);

            for(int j=2;j<i;j++)
            {
                System.out.println(x[j]);
            }
        }
        catch (IOException ioException) 
        {
            ioException.printStackTrace();
        }

    }
}
   You can create batch file like 

TASKLIST / v / FI "STATUS eq रनिंग" / एफओ "CSV" / FI "यूजरनेम eq LHPL002 \ सॉफ्ट" / FI "MEMUSAGE gt 10000" / FI "Windowtitle ne N / A" / NH


0

यह एक फ़ंक्शन के लिए मेरा कोड है जो कार्यों को प्राप्त करता है और उनके नाम प्राप्त करता है, उन्हें सूची में शामिल करने के लिए एक सूची में भी जोड़ता है। यह डेटा के साथ अस्थायी फाइलें बनाता है, फाइलों को पढ़ता है और। Exe प्रत्यय के साथ कार्य नाम प्राप्त करता है, और जब सिस्टम System.exit (0) के साथ बाहर निकल जाता है, तो फ़ाइलों को हटाने की व्यवस्था करता है, यह उन प्रक्रियाओं को भी छिपाता है जिनका उपयोग किया जा रहा है कार्य प्राप्त करें और java.exe भी ताकि उपयोगकर्ता गलती से प्रोग्राम को चलाने वाली प्रक्रिया को एक साथ नहीं मार सके।

private static final DefaultListModel tasks = new DefaultListModel();

public static void getTasks()
{
    new Thread()
    {
        @Override
        public void run()
        {
            try 
            {
                File batchFile = File.createTempFile("batchFile", ".bat");
                File logFile = File.createTempFile("log", ".txt");
                String logFilePath = logFile.getAbsolutePath();
                try (PrintWriter fileCreator = new PrintWriter(batchFile)) 
                {
                    String[] linesToPrint = {"@echo off", "tasklist.exe >>" + logFilePath, "exit"};
                    for(String string:linesToPrint)
                    {
                        fileCreator.println(string);
                    }
                    fileCreator.close();
                }
                int task = Runtime.getRuntime().exec(batchFile.getAbsolutePath()).waitFor();
                if(task == 0)
                {
                    FileReader fileOpener = new FileReader(logFile);
                    try (BufferedReader reader = new BufferedReader(fileOpener))
                    {
                        String line;
                        while(true)
                        {
                            line = reader.readLine();
                            if(line != null)
                            {
                                if(line.endsWith("K"))
                                {
                                    if(line.contains(".exe"))
                                    {
                                        int index = line.lastIndexOf(".exe", line.length());
                                        String taskName = line.substring(0, index + 4);
                                        if(! taskName.equals("tasklist.exe") && ! taskName.equals("cmd.exe") && ! taskName.equals("java.exe"))
                                        {
                                            tasks.addElement(taskName);
                                        }
                                    }
                                }
                            }
                            else
                            {
                                reader.close();
                                break;
                            }
                        }
                    }
                }
                batchFile.deleteOnExit();
                logFile.deleteOnExit();
            } 
            catch (FileNotFoundException ex) 
            {
                Logger.getLogger(Functions.class.getName()).log(Level.SEVERE, null, ex);
            } 
            catch (IOException | InterruptedException ex) 
            {
                Logger.getLogger(Functions.class.getName()).log(Level.SEVERE, null, ex);
            }
            catch (NullPointerException ex)
            {
                // This stops errors from being thrown on an empty line
            }
        }
    }.start();
}

public static void killTask(String taskName)
{
    new Thread()
    {
        @Override
        public void run()
        {
            try 
            {
                Runtime.getRuntime().exec("taskkill.exe /IM " + taskName);
            } 
            catch (IOException ex) 
            {
                Logger.getLogger(Functions.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }.start();
}

मैंने इस कोड को विंडोज 10 के लिए अंतर्निहित कार्य प्रबंधक की कोशिश करने और दोहराने के लिए एक पूर्ण कार्यक्रम में बनाया है, अगर किसी को दिलचस्पी है, तो मैं आपको इसका एक डेमो भेज सकता हूं।
डायलन वेसमैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.