java মওয কিভাবে একটি জাভা প্রোগ্রাম নিজস্ব প্রক্রিয়া আইডি পেতে পারেন?




জাভা ফ্রেমওয়ার্ক (18)

আপনি github.com/jnr/jnr-posix getpid() চেষ্টা করতে পারেন।

এটি একটি উইন্ডোজ পসিক্স র্যাপার যা libc এর getpid () বন্ধ করে।

আমি কিভাবে আমার জাভা প্রক্রিয়া আইডি পেতে পারি?

আমি অনেক প্ল্যাটফর্ম নির্ভর হ্যাক আছে জানেন, কিন্তু আমি একটি আরো জেনারিক সমাধান পছন্দ করবে।


java.lang.management.ManagementFactory.getRuntimeMXBean().getName().split("@")[0]

Scala মধ্যে:

import sys.process._
val pid: Long = Seq("sh", "-c", "echo $PPID").!!.trim.toLong

জাভা 9টি মুক্তি না হওয়া পর্যন্ত এটি আপনাকে ইউনিক্স সিস্টেমগুলিতে একটি কার্যকর কাজ করবে। (আমি জানি, প্রশ্নটি জাভা সম্পর্কে ছিল, কিন্তু স্কালার জন্য সমান প্রশ্ন নেই, তাই আমি Scala ব্যবহারকারীদের জন্য এটি ছেড়ে দিতে চেয়েছিলাম যারা একই প্রশ্নে পড়ে যেতে পারে।)


অন্যান্য সমাধান যোগ করা হচ্ছে।

জাভা 10 দিয়ে, process id পেতে

final RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();
final long pid = runtime.getPid();
out.println("Process ID is '" + pid);

এটি থেকে আপনি তথ্য খুঁজছেন যেখানে উপর নির্ভর করে।

আপনি কনসোল থেকে তথ্য খুঁজছেন হলে আপনি jps কমান্ড ব্যবহার করতে পারেন। কমান্ড ইউনিক্স ps কমান্ডের অনুরূপ আউটপুট দেয় এবং আমি বিশ্বাস করি যে 1.5 ডি

আপনি যদি প্রক্রিয়া থেকে দেখছেন RuntimeMXBean (যেমন Wouter Coekaerts দ্বারা) সম্ভবত আপনার সেরা পছন্দ। সূর্য জেডিকে 1.6 ইউ 7 ব্যবহার করে উইন্ডোজে GetName () থেকে আউটপুটটি ফর্ম [PROCESS_ID] @ [MACHINE_NAME] আকারে রয়েছে। তবে আপনি jps চালানোর চেষ্টা করতে পারেন এবং এর ফলাফলটি বিশ্লেষণ করতে পারেন:

String jps = [JDK HOME] + "\\bin\\jps.exe";
Process p = Runtime.getRuntime().exec(jps);

কোন বিকল্পের সাথে চালানো হলে আউটপুট নাম অনুসরণ করে প্রক্রিয়া আইডি হওয়া উচিত।


public static long getPID() {
    String processName = java.lang.management.ManagementFactory.getRuntimeMXBean().getName();
    if (processName != null && processName.length() > 0) {
        try {
            return Long.parseLong(processName.split("@")[0]);
        }
        catch (Exception e) {
            return 0;
        }
    }

    return 0;
}

পুরোনো JVM, লিনাক্সে ...

private static String getPid() throws IOException {
    byte[] bo = new byte[256];
    InputStream is = new FileInputStream("/proc/self/stat");
    is.read(bo);
    for (int i = 0; i < bo.length; i++) {
        if ((bo[i] < '0') || (bo[i] > '9')) {
            return new String(bo, 0, i);
        }
    }
    return "-1";
}

সর্বশেষটি পাওয়া গেছে যে sun.java.launcher.pid নামে একটি সিস্টেমের সম্পত্তি রয়েছে যা অন্তত লিনাক্সে পাওয়া যায়। আমার পরিকল্পনাটি ব্যবহার করা হয় এবং যদি এটি JMX bean ব্যবহার না পাওয়া যায়।


আমি একটি সমাধান খুঁজে পেয়েছি যা একটি প্রান্তের কেস হতে পারে এবং উইন্ডোজ 10 এর চেয়ে অন্য OS তে এটি চেষ্টা করে নি, তবে মনে হচ্ছে এটি মূল্যবান।

যদি আপনি J2V8 এবং নোডেজগুলির সাথে কাজ করে J2V8 তবে আপনি জাভা প্রক্রিয়াটির পিড ফেরত পাঠানো একটি সহজ জাভাস্ক্রিপ্ট ফাংশন চালাতে পারেন।

এখানে একটি উদাহরণ:

public static void main(String[] args) {
    NodeJS nodeJS = NodeJS.createNodeJS();
    int pid = nodeJS.getRuntime().executeIntegerScript("process.pid;\n");
    System.out.println(pid);
    nodeJS.release();
}

আমি জানি এটি একটি পুরানো থ্রেড, তবে আমি পিআইডি পাওয়ার জন্য সেই API টি (এবং রানটাইম এ জাভা প্রসেসের অন্যান্য ম্যানিপুলেশন) পাওয়ার জন্য কল করতে চেয়েছিলাম JDK 9: openjdk.java.net/jeps/102 এ প্রসেস ক্লাসে openjdk.java.net/jeps/102


জাভা 9 এর থেকে একটি পদ্ধতি হল Process.getPid () যা একটি প্রক্রিয়ার নেটিভ আইডি প্রদান করে:

public abstract class Process {

    ...

    public long getPid();
}

বর্তমান জাভা প্রক্রিয়াটির প্রক্রিয়া আইডি পেতে ProcessHandle ইন্টারফেস ব্যবহার করতে পারেন:

System.out.println(ProcessHandle.current().pid());

এই একই প্রয়োজন ছিল যখন আমি কি ব্যবহার করা হয়। এটি জাভা প্রক্রিয়াটির PID সঠিকভাবে নির্ধারণ করে। আপনার জাভা কোডটি একটি পূর্ব-সংজ্ঞায়িত পোর্ট নাম্বারে একটি সার্ভার স্পন করুন এবং তারপরে পোর্টে পড শোনার জন্য OS কমান্ডগুলি চালান। লিনাক্সের জন্য

netstat -tupln | grep portNumber

এখানে একটি ব্যাকডোর পদ্ধতি যা সমস্ত ভিএমগুলির সাথে কাজ করে না তবে এটি লিনাক্স এবং উইন্ডোজ ( এখানে আসল উদাহরণ ) উভয় ক্ষেত্রেই কাজ করা উচিত:

java.lang.management.RuntimeMXBean runtime = 
    java.lang.management.ManagementFactory.getRuntimeMXBean();
java.lang.reflect.Field jvm = runtime.getClass().getDeclaredField("jvm");
jvm.setAccessible(true);
sun.management.VMManagement mgmt =  
    (sun.management.VMManagement) jvm.get(runtime);
java.lang.reflect.Method pid_method =  
    mgmt.getClass().getDeclaredMethod("getProcessId");
pid_method.setAccessible(true);

int pid = (Integer) pid_method.invoke(mgmt);

SIGAR 2.0 লাইসেন্সের SIGAR সম্পর্কে অশ্বিন জয়প্রকাশের answer (+1) এর উপর ভিত্তি করে, এখানে আমি কীভাবে বর্তমান প্রক্রিয়াটির PID পাওয়ার জন্য এটি ব্যবহার করব:

import org.hyperic.sigar.Sigar;

Sigar sigar = new Sigar();
long pid = sigar.getPid();
sigar.close();

যদিও এটি সমস্ত প্ল্যাটফর্মগুলিতে কাজ করে না তবে এটি লিনাক্স, উইন্ডোজ, ওএস এক্স এবং বিভিন্ন ইউনিক্স প্ল্যাটফর্মগুলিতে এখানে তালিকাবদ্ধ হিসাবে কাজ করে


আপনি আমার প্রকল্প চেক আউট করতে পারেন: GitHub এ JavaSysMon । এটি প্রক্রিয়া আইডি এবং অন্যান্য স্টাফগুলির একটি গুচ্ছ প্রদান করে (CPU ব্যবহার, মেমরি ব্যবহার) ক্রস প্ল্যাটফর্ম (বর্তমানে উইন্ডোজ, ম্যাক OSX, Linux এবং Solaris)


সম্পূর্ণতা জন্য স্প্রিং বুট একটি মোড়ক আছে

String jvmName = ManagementFactory.getRuntimeMXBean().getName();
return jvmName.split("@")[0];

সমাধান। একটি পূর্ণসংখ্যা প্রয়োজন হলে, এটি এক-মাছ ধরার নৌকা পর্যন্ত সংক্ষেপ করা যেতে পারে:

int pid = Integer.parseInt(ManagementFactory.getRuntimeMXBean().getName().split("@")[0]);

কেউ ইতিমধ্যে স্প্রিং বুট ব্যবহার করে, সে / তিনি org.springframework.boot.plicationPid ব্যবহার করতে পারে

ApplicationPid pid = new ApplicationPid();
pid.toString();

ToString () পদ্ধতিটি পিড বা '???' প্রিন্ট করে।

ManagementFactory ব্যবহার করে ক্যাভিট ইতিমধ্যে অন্যান্য উত্তর আলোচনা করা হয়।


নিম্নলিখিত পদ্ধতিটি java.lang.management.ManagementFactory থেকে PID বের করার চেষ্টা করে। java.lang.management.ManagementFactory :

private static String getProcessId(final String fallback) {
    // Note: may fail in some JVM implementations
    // therefore fallback has to be provided

    // something like '<pid>@<hostname>', at least in SUN / Oracle JVMs
    final String jvmName = ManagementFactory.getRuntimeMXBean().getName();
    final int index = jvmName.indexOf('@');

    if (index < 1) {
        // part before '@' empty (index = 0) / '@' not found (index = -1)
        return fallback;
    }

    try {
        return Long.toString(Long.parseLong(jvmName.substring(0, index)));
    } catch (NumberFormatException e) {
        // ignore
    }
    return fallback;
}

উদাহরণস্বরূপ, getProcessId("<PID>") কল করুন।


এখানে আমার সমাধান:

public static boolean isPIDInUse(int pid) {

        try {

            String s = null;
            int java_pid;

            RuntimeMXBean rt = ManagementFactory.getRuntimeMXBean();
            java_pid = Integer.parseInt(rt.getName().substring(0, rt.getName().indexOf("@")));

            if (java_pid == pid) {
                System.out.println("In Use\n");
                return true;
            }
        } catch (Exception e) {
            System.out.println("Exception:  " + e.getMessage());
        }
        return false;
    }






pid