জাভা সহ বর্তমান ওপেন উইন্ডোজ / প্রক্রিয়াটির তালিকা কীভাবে পাবেন?


96

জাভা ব্যবহার করে আমি কীভাবে বর্তমান উন্মুক্ত উইন্ডোজ বা স্থানীয় মেশিনের প্রক্রিয়া পেতে পারি তা কি কেউ জানেন?

আমি যা করার চেষ্টা করছি তা হ'ল: উইন্ডোজ টাস্কম্যানেজারের মতো বর্তমান ওপেন টাস্ক, উইন্ডোজ বা প্রক্রিয়া উন্মুক্ত তালিকাবদ্ধ করুন, তবে একাধিক প্ল্যাটফর্মের পদ্ধতি ব্যবহার করা - যদি সম্ভব হয় তবে কেবল জাভা ব্যবহার করুন।

উত্তর:


106

" পিএস-ই " কমান্ড থেকে প্রক্রিয়া তালিকাকে পার্স করার জন্য এটি অন্য পদ্ধতি :

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();
}

আপনি যদি উইন্ডোজ ব্যবহার করে থাকেন তবে আপনার লাইনটি পরিবর্তন করা উচিত: "প্রক্রিয়া পি = রানটাইম.সেটআর ..." ইত্যাদি ... (তৃতীয় লাইন) এর মতো দেখতে:

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

আশা করি তথ্য সাহায্য করবে!


প্রক্রিয়াটি শুরু করার সময় এবং শেষ সময়টি কীভাবে পাবেন
বকস

34
উইন্ডোজে, tasklist.exe /fo csv /nhসিএসভি ফর্ম্যাটে তালিকা পেতে রান করুন, এটি পার্স করা আরও সহজ।
এমমানুয়েল

তবে এটি জারের নাম দেখাচ্ছে না। আমার এক্সিকিউটেবল জারের নাম হ্যালোডেমো.জার। তবে এটি এর জন্য কিছুই দেখাচ্ছে না
সুমন বাপ্পি

আমি যুক্ত করলে এটি কেন কাজ করবে না? গ্রেপ জাভা? অর্থাত্ ps -elf | grep javaকোনও জিনিস ফেরত দেবে না, তবে ps -elfপ্রত্যাশা অনুযায়ী কাজ করবে।
Itay Moav -Malimovka

এটি লক্ষ করা উচিত যে নীচে "উইন্ডোজ নির্দিষ্ট" বিট অপ্রয়োজনীয় বলে মনে হয়। উইন্ডোজ 10 এ, (.exec (Runtime/getRuntime) "tasklist"))(ক্লোজারে, জাভা-ইন্টারপ ব্যবহার করে) সঠিকভাবে tasklistকোনও ডিরেক্টরি উল্লেখ না করেই প্রক্রিয়াটি ফিরিয়ে দেয় ।
কারসিজিনিট

42

অবশেষে, জাভা 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

প্রসেসহ্যান্ডেলের সাথে কাজ করতে কোন আমদানি যুক্ত করা উচিত?
জর্ডি

4
এই শ্রেণীর java.langকোনও আমদানির প্রয়োজন নেই
হিউজ এম।

23

উইন্ডোজে জেএনএ ব্যবহার করে বিকল্প রয়েছে :

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);
    }
}

এটি কেবলমাত্র কমান্ডের নামটি পুরো কমান্ড লাইনকে দেয় না। পুরো কমান্ড লাইন পাওয়ার কোনও উপায় আছে?
ক্রিস্টোফার ড্যান্সি

4
ফোন করে আপনি পুরো পথটি পেতে পারেন GetModuleFileName। উদাহরণস্বরূপ stackoverflow.com/questions/7521693/… দেখুন ।
এমমানুয়েল

একমাত্র সমস্যা ডাব্লু / এটি হ'ল এটি সম্পূর্ণ কমান্ড লাইন নয় কেবল প্রক্রিয়াটির পথ দেয়। প্রক্রিয়াটির সম্পূর্ণ কমান্ড লাইন পাওয়ার কোনও উপায় আছে (যেমন 'ant.bat -f হ্যালো ওয়ার্ল্ড.সেক্সট')?
ক্রিস্টোফার ড্যান্সি

xyz.exe চলছে কিনা এমন কোনও নির্দিষ্ট প্রক্রিয়াটি কীভাবে পরীক্ষা করবেন?
অজানা

@ ক্রিস্টোফারডেন্সি নিশ্চিত না যে আপনার এখনও উত্তর প্রয়োজন আছে কিনা তবে সম্পূর্ণতার জন্য এবং এবং এটি এখানেও উল্লেখ করা হয়নি: উইনডউজ ম্যানেজমেন্ট ইনফরমেশন কমান্ড-লাইন (বা কেবল 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
}

4
হ্যাঁ, আমি এটি সম্পর্কে ইতিমধ্যে ভেবেছিলাম, তবে আমি শক্ত এটি জাভা দিয়েই করা যেতে পারে। এবং আমি মনে করি শীর্ষের পরিবর্তে "PS -aux" ব্যবহার করা ভাল। দ্রুত উত্তর দেওয়ার জন্য ধন্যবাদ!
রামায়াক

উইন্ডোজে, tasklistপ্রোগ্রামটি সিএসভি আউটপুট কনফিগার করা যেতে পারে :)
মওগানরা

7

YAJSW (তবুও অন্য একটি জাভা সার্ভিস র‍্যাপার ) দেখে মনে হচ্ছে এটির জেএনএ ভিত্তিক উইন 32, লিনাক্স, বিএসডি এবং সোলারিসের জন্য org.rzo.yajsw.os.TaskList ইন্টারফেসের বাস্তবায়ন রয়েছে এবং এটি একটি এলজিপিএল লাইসেন্সের অধীনে। আমি এই কোডটি সরাসরি কল করার চেষ্টা করি নি, তবে YAJSW অতীতে এটি ব্যবহার করার সময় সত্যই ভাল কাজ করে, তাই আপনার খুব বেশি উদ্বেগ হওয়ার দরকার নেই।


আপাতদৃষ্টিতে ভি 12 + হ'ল অ্যাপাচি / এলজিপিএল দ্বৈত লাইসেন্স
হার্শওয়ার

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("------------------");
}

এই গ্রন্থাগারটি খুব ধীর বলে মনে হচ্ছে ... এর কোনও কারণ আছে (বা এটি সাধারণ জবা + ডাব্লুআইএমআই ইন্টারফেসটি ভিবিএস জুড়ে?
গবলিন্স

4
আমার ধারণা আপনি উইন্ডোজ বাস্তবায়নের বিষয়ে কথা বলবেন। হ্যাঁ, সাধারণত ডাব্লুএমআই প্রশ্নগুলি কিছুটা সময় নেয়। সর্বদা হিসাবে এটি ব্যবহারের ক্ষেত্রে নির্ভর করে। আপনার যদি প্রতি 10 এমএসে ক্যোয়ারীটি করাতে হয় তবে হ্যাঁ, এটি খুব ধীর।
অধ্যাপক_ফ্যালকেন

হ্যাঁ আমি জয়ের কথা বলছিলাম, লিনাক্সে আমি "পিএস ... <
ফাংশন

ঠিক আছে, আপনি যদি চান তবে আপনি গিথুব প্রকল্পে একটি সমস্যা তৈরি করতে পারেন এবং আমি শেষ পর্যন্ত একবার ঘুরে দেখব এবং আমি উইনে পারফরম্যান্সের উন্নতি করতে পারি কিনা। আসলে আমি এটি লিনাক্সে ব্যবহার করেছি তাই বাস্তবায়নের পক্ষে জয়ের দিকে আমি খুব বেশি মনোযোগ দিই নি: -এস
অধ্যাপক_ফ্যালকেন

এটি ঠিক আছে, তবে আমি যা খুঁজছিলাম: আপনার প্রক্রিয়া শুরুতে আপনি যদি ভুল না হন তবে আপনি একদিনের জন্য নির্দিষ্ট সময় সীমাবদ্ধ রেখেছেন (এইচ: মিমি: এসএস)। তারিখ + সময় (yyyy-mm-dd-hh: মিমি: এসএস) পাওয়ারও কি কোনও বিকল্প আছে?
গব্লিন্স

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

এটি একটি বান্ডিলযুক্ত জেআরই সহ অ্যাপ্লিকেশনগুলির জন্য দরকারী হতে পারে: আমি যে ফোল্ডারটির নামটি থেকে অ্যাপ্লিকেশনটি চালাচ্ছি তার জন্য স্ক্যান করি: সুতরাং আপনি যদি অ্যাপ্লিকেশনটি প্রয়োগ করেন তবে তা থেকে:

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

এরপরে আপনি এটি জে 9 এ চলছে কিনা তা আবিষ্কার করতে পারেন:

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খুব, যা দ্রুত এবং সহজ অনুসন্ধানের প্রক্রিয়াকরণ করতে হবে /। আমি নিশ্চিত আপনি উইন্ডোজের জন্যও অনুরূপ কিছু খুঁজে পেতে পারেন।


আপনি আরও বিস্তারিতভাবে টাস্কলিস্টটি
জেমস

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 

তাসকলিস্ট / ভি / এফআই "স্ট্যাটাস এক চলমান" / এফও "সিএসভি" / এফআই "ব্যবহারকারীর নাম এলএইচপিএল 3002 \ নরম" / এফআই "মেমাসেজ জিটি 10000" / এফআই "উইন্ডোউইটেল নে এন / এ" / এনএইচ


0

এটি কোনও ক্রিয়াকলাপের জন্য আমার কোড যা কাজগুলি পায় এবং তাদের নাম পায়, এছাড়াও তালিকা থেকে অ্যাক্সেস করার জন্য তাদের তালিকায় যুক্ত করে। এটি ডেটা সহ অস্থায়ী ফাইল তৈরি করে, ফাইলগুলি পড়ে এবং .exe প্রত্যয় সহ টাস্কের নাম পায় এবং প্রোগ্রামটি সিস্টেম.এক্সিট (0) এর সাথে উপস্থিত হয়ে গেলে ফাইলগুলি মুছে ফেলার ব্যবস্থা করে, এটি ব্যবহৃত প্রক্রিয়াগুলিও আড়াল করে কার্যগুলি পান এবং জাভা.এক্সেও পাবেন যাতে ব্যবহারকারী দুর্ঘটনাক্রমে সমস্ত প্রক্রিয়াটি একসাথে চালিত প্রক্রিয়াটিকে হত্যা করতে না পারে।

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 এর জন্য অন্তর্নির্মিত টাস্ক ম্যানেজারটির চেষ্টা এবং প্রতিরূপ তৈরি করার জন্য আমি এই কোডটি একটি সম্পূর্ণ প্রোগ্রামেও তৈরি করেছি, যদি কেউ আগ্রহী হয় তবে আমি আপনাকে এর একটি ডেমো পাঠাতে পারি।
ডিলান বুদম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.