Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Java

Java 9 Process API: ProcessHandle.Info से प्रक्रिया स्नैपशॉट प्राप्त करें

Java 9 ने Process API को महत्वपूर्ण रूप से बढ़ाया, जिसमें ProcessHandle और ProcessHandle.Info इंटरफेस पेश किए गए जो ऑपरेटिंग सिस्टम प्रक्रियाओं के बारे में विस्तृत जानकारी प्रदान करते हैं बिना JNI या बाहरी कमांड के।

मुख्य इंटरफेस

  • ProcessHandle: एक देशी प्रक्रिया की पहचान करता है और नियंत्रण प्रदान करता है - PID, जीवंतता, बच्चे, जानकारी, नष्ट करना।
  • ProcessHandle.Info: एक प्रक्रिया का अपरिवर्तनीय स्नैपशॉट - उपयोगकर्ता, कमांड, आर्गुमेंट्स, प्रारंभ समय, कुल CPU अवधि।

ProcessHandle.Info में उपलब्ध जानकारी

बुनियादी उपयोग उदाहरण

import java.lang.ProcessHandle;
import java.lang.ProcessHandle.Info;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;

public class ProcessSnapshotExample {
    public static void main(String[] args) {
        // वर्तमान प्रक्रिया का हैंडल प्राप्त करें
        ProcessHandle currentProcess = ProcessHandle.current();
        
        System.out.println("=== वर्तमान प्रक्रिया स्नैपशॉट ===");
        System.out.println("PID: " + currentProcess.pid());
        
        // Info स्नैपशॉट प्राप्त करें
        Info info = currentProcess.info();
        
        // जानकारी प्रिंट करें (सभी Optional हैं!)
        info.command().ifPresent(cmd -> System.out.println("कमांड: " + cmd));
        info.commandLine().ifPresent(cl -> System.out.println("कमांड लाइन: " + cl));
        info.arguments().ifPresent(argsArr -> 
            System.out.println("आर्गुमेंट्स: " + String.join(" ", argsArr)));
        info.user().ifPresent(user -> System.out.println("उपयोगकर्ता: " + user));
        
        // समय स्वरूपण
        info.startInstant().ifPresent(instant -> {
            String formatted = instant.atZone(ZoneId.systemDefault())
                                    .format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
            System.out.println("प्रारंभ समय: " + formatted);
        });
        
        info.totalDuration().ifPresent(duration -> 
            System.out.println("कुल CPU समय: " + duration));
    }
}

आउटपुट उदाहरण

=== वर्तमान प्रक्रिया स्नैपशॉट ===
PID: 12345
कमांड: /usr/lib/jvm/java-17/bin/java
कमांड लाइन: /usr/lib/jvm/java-17/bin/java -cp target/classes ProcessSnapshotExample
आर्गुमेंट्स: [-cp, target/classes, ProcessSnapshotExample]
उपयोगकर्ता: john
प्रारंभ समय: 2024-01-15T10:30:45.123
कुल CPU समय: PT1.234S

PID द्वारा प्रक्रिया स्नैपशॉट प्राप्त करना

public static void printProcessSnapshot(long pid) {
    ProcessHandle.of(pid).ifPresentOrElse(
        process -> {
            System.out.println("PID " + pid + " मिला:");
            Info info = process.info();
            
            info.command().ifPresent(c -> System.out.println("  कमांड: " + c));
            info.user().ifPresent(u -> System.out.println("  उपयोगकर्ता: " + u));
            info.startInstant().ifPresent(i -> 
                System.out.println("  प्रारंभ: " + i.atZone(ZoneId.systemDefault())));
            info.totalDuration().ifPresent(d -> System.out.println("  CPU: " + d));
        },
        () -> System.out.println("PID " + pid " के साथ कोई प्रक्रिया नहीं मिली")
    );
}

सभी सिस्टम प्रक्रियाओं को सूचीबद्ध करना

import java.util.stream.Stream;

public class ListAllProcesses {
    public static void main(String[] args) {
        // सभी दृश्यमान प्रक्रियाएं प्राप्त करें
        Stream allProcesses = ProcessHandle.allProcesses();
        
        System.out.println("=== सभी प्रक्रियाएं ===");
        allProcesses.limit(20).forEach(ph -> { // पहले 20 तक सीमित
            Info info = ph.info();
            String cmd = info.command().orElse("N/A");
            String user = info.user().orElse("N/A");
            String start = info.startInstant()
                .map(i -> i.atZone(ZoneId.systemDefault()).toLocalDateTime().toString())
                .orElse("N/A");
            
            System.out.printf("PID: %-8d User: %-15s Start: %-25s Cmd: %s%n", 
                ph.pid(), user, start, cmd);
        });
    }
}

प्रक्रिया पेड़: बच्चे और वंशज

public static void printProcessTree(ProcessHandle process, String indent) {
    Info info = process.info();
    String cmd = info.command().orElse("?");
    String user = info.user().orElse("?");
    
    System.out.println(indent + "PID: " + process.pid() + " | " + cmd + " | " + user);
    
    // बच्चे प्रक्रियाएं
    process.children().forEach(child -> printProcessTree(child, indent + "  "));
}

// उपयोग
public static void main(String[] args) {
    printProcessTree(ProcessHandle.current(), "");
}

प्रक्रिया निगरानी: जीवंतता और प्रतीक्षा

public static void monitorProcess(long pid) {
    ProcessHandle.of(pid).ifPresent(process -> {
        System.out.println("प्रक्रिया " + pid + " की निगरानी...");
        
        // पूर्ण होने की प्रतीक्षा करें (ब्लॉकिंग)
        process.onExit().thenAccept(ph -> {
            System.out.println("प्रक्रिया " + ph.pid() + " समाप्त हुई");
            ph.info().totalDuration().ifPresent(d -> 
                System.out.println("कुल CPU: " + d));
        });
        
        // या लाइव जांचें
        while (process.isAlive()) {
            System.out.println("अभी भी चल रही है... CPU: " + 
                process.info().totalDuration().orElse(java.time.Duration.ZERO));
            try { Thread.sleep(1000); } catch (InterruptedException e) { break; }
        }
    });
}

महत्वपूर्ण विचार

  • सभी मेथड्स Optional लौटाते हैं: जानकारी OS और अनुमतियों के आधार पर अनुपलब्ध हो सकती है
  • प्लेटफॉर्म अंतर: Windows पर commandLine() और arguments() अक्सर अनुपलब्ध होते हैं
  • अनुमतियां: अन्य उपयोगकर्ताओं की प्रक्रियाओं के लिए जानकारी प्रतिबंधित हो सकती है
  • स्नैपशॉट: Info ऑब्जेक्ट एक स्नैपशॉट है; लाइव डेटा के लिए फिर से info() कॉल करें
  • PID पुनर्चक्रण: PID का पुनः उपयोग किया जा सकता है; ProcessHandle.of(pid) गलत प्रक्रिया लौटा सकता है

व्यावहारिक उपयोग केस

  • एप्लिकेशन निगरानी: CPU/मेमोरी उपयोग ट्रैक करें
  • प्रक्रिया प्रबंधन: चाइल्ड प्रक्रियाओं को ढूंढें और समाप्त करें
  • डिबगिंग: प्रारंभ समय, आर्गुमेंट्स, वातावरण का निरीक्षण करें
  • स्वास्थ्य जांच: सत्यापित करें कि महत्वपूर्ण सेवाएं चल रही हैं
  • बेंचमार्किंग: CPU समय मापें
  1. Android में YearMonth API क्लास का उपयोग करके महीने की जानकारी कैसे प्राप्त करें? Android में YearMonth API क्लास का उपयोग करके महीने की जानकारी कैसे प्राप्त करें?

    YearMonth API के साथ वर्ष-महीना संयोजन प्राप्त करना यह उदाहरण दर्शाता है कि Android में YearMonth API क्लास का उपयोग करके महीने की जानकारी कैसे प्राप्त करें। चरण 1 - नया प्रोजेक्ट बनाएं Android Studio में एक नया प्रोजेक्ट बनाएं: File → New Project पर जाएं और सभी आवश्यक विवरण भरकर नया प्रोजेक्ट बनाए

  1. जावा 9 में ProcessBuilder का उपयोग करके प्रोसेस कैसे बनाएं? जावा 9 में ProcessBuilder का उपयोग करके प्रोसेस कैसे बनाएं?

    जावा 9  ने ProcessHandle  इंटरफेस को Process API में जोड़ा है ताकि Process क्लास को बढ़ाया जा सके। ProcessHandle इंटरफेस का एक इंस्टेंस एक स्थानीय प्रक्रिया की पहचान करता है जो हमें प्रक्रिया स्थिति  क्वेरी करने और प्रक्रियाओं को प्रबंधित करने की अनुमति देता है, और ProcessHandle.Info

  1. अपने Linux PC के बारे में हार्डवेयर जानकारी आसानी से कैसे प्राप्त करें अपने Linux PC के बारे में हार्डवेयर जानकारी आसानी से कैसे प्राप्त करें

    जब आपका Linux कंप्यूटर समस्याएं देना शुरू करता है और आपको इसका निवारण करने की आवश्यकता होती है, तो पहली चीज़ जो आपको करने की आवश्यकता होती है वह है अपने कंप्यूटर की हार्डवेयर जानकारी का पता लगाना। प्रत्येक भाग को व्यक्तिगत रूप से देखने के लिए इसे डिसअसेंबल करने के बजाय, आप HardInfo, एक छोटे और उपयो

© कॉपीराइट https://in.wsxdn.com सर्वाधिकार सुरक्षित
मेथडवापसी प्रकारविवरण
command()Optional<String>प्रक्रिया का निष्पादन योग्य पथ
commandLine()Optional<String>पूर्ण कमांड लाइन (OS-निर्भर)
arguments()Optional<String[]>कमांड लाइन आर्गुमेंट्स
user()Optional<String>प्रक्रिया मालिक उपयोगकर्ता
startInstant()Optional<Instant>प्रक्रिया प्रारंभ समय
totalDuration()Optional<Duration>कुल CPU समय