2011-03-12 10 views
21

अगर मैं Runtime.getRuntime().exec(...), या ProcessBuilder.start() के माध्यम से जावा में एक प्रक्रिया वस्तु मिलता है, मैं Process.waitFor() के माध्यम से इसके लिए इंतजार कर सकते हैं, जो Thread.join() की तरह है, या मैं जिसका बहिष्कार Thread.stop() की तरह है Process.destroy() के साथ मार सकता है,।जावा में शुरू की गई प्रक्रिया की प्रक्रिया आईडी (पिड) मैं कैसे पा सकता हूं?

लेकिन: मैं प्रक्रिया ऑब्जेक्ट की पिड कैसे पा सकता हूं? मुझे The Official Documentation में ऐसा करने के लिए कोई विधि नहीं दिखाई दे रही है। क्या मैं जावा में ऐसा कर सकता हूं? यदि हां, तो कैसे?

उत्तर

10

यह लड़का पीआईडी ​​प्राप्त करने के लिए बाश करने के लिए कहता है। मुझे यकीन नहीं है कि समस्या के लिए जावा समाधान है या नहीं।

/** 
* Gets a string representing the pid of this program - Java VM 
*/ 
public static String getPid() throws IOException,InterruptedException { 

    Vector<String> commands=new Vector<String>(); 
    commands.add("/bin/bash"); 
    commands.add("-c"); 
    commands.add("echo $PPID"); 
    ProcessBuilder pb=new ProcessBuilder(commands); 

    Process pr=pb.start(); 
    pr.waitFor(); 
    if (pr.exitValue()==0) { 
    BufferedReader outReader=new BufferedReader(new InputStreamReader(pr.getInputStream())); 
    return outReader.readLine().trim(); 
    } else { 
    System.out.println("Error while getting PID"); 
    return ""; 
    } 
} 

स्रोत: http://www.coderanch.com/t/109334/Linux-UNIX/UNIX-process-ID-java-program

+0

मुझे लगता है कि यह जेवीएम प्रक्रिया का ढक्कन देगा ... जावा द्वारा उत्पन्न प्रक्रिया नहीं, जो मुझे विश्वास है कि प्रश्न क्या पूछ रहा है। – splashout

+0

मुझे लगता है कि आपको थोड़ा करीब पढ़ने की जरूरत है। यह एक प्रक्रिया को जन्म देता है कि केवल नौकरी ही अपने स्वयं के पीआईडी ​​को अपने stdout पर गूंजना है जो स्वयं JVM से जुड़े stdin फ़ाइल डिस्क्रिप्टर को पाइप कर रहा है। – nsfyn55

+0

वेक्टर पुराने-टोपी हैं, और सिंक्रनाइज़ हैं - इस प्रकार के संग्रह का उपयोग करने की कोई वास्तविक आवश्यकता नहीं है - इसके बजाए एक ऐरेलिस्ट का उपयोग करने का प्रयास करें। बस केह रहा हू। – user924272

-2

मैं जावा में लगता है कि अपने सबसे अच्छे शॉट से पहले और अपने बच्चे की प्रक्रिया को उत्पन्न करने के बाद tasklist प्राप्त करने के लिए है। एक diff बनाओ और अपने पीआईडी ​​प्राप्त करें।

आप एक Runtime.getRuntime.exec("tasklist");
सूचना है कि tasklist.exe Windows XP होम संस्करण के साथ शामिल नहीं है जारी करके कार्यसूची प्राप्त कर सकते हैं, लेकिन अभी भी आप इसे डाउनलोड कर सकते हैं।

+0

आप मान रहे हैं कि मैं विंडोज़ पर हूं, जो मैं नहीं हूं। –

7

उल्लिखित अन्य उपकरणों के समान, jps कमांड लाइन उपकरण जो जावा रनटाइम के साथ आता है। यह सभी चल रहे JVMs के पीआईडी ​​को थूकता है। लाभ यह है कि आउटपुट को पार्स करने की आवश्यकता केवल जेवीएम प्रक्रियाओं तक ही सीमित है।

+0

एक और लाभ: यह कार्यसूची के विपरीत, क्रॉस-प्लेटफार्म है। –

0

लियो, इस मुद्दे को लगभग एक हफ्ते तक देखने के बाद मुझे लगता है कि झुर्टाडो का दृष्टिकोण संभव है कि हम जावा में "सर्वश्रेष्ठ" दृष्टिकोण का प्रबंधन कर सकें। "सर्वश्रेष्ठ" उद्धरणों में है क्योंकि इसका मूल रूप से "अनुमान" होने का बहुत बुरा दुष्प्रभाव है कि आपका बच्चा पीआईडी ​​क्या है।

यदि आपका जावा ऐप उच्च प्रक्रिया प्रणाली में जल्दी से मूल प्रक्रियाओं को जन्म दे रहा है, तो कोई गारंटी नहीं है कि आपके डीआईडी ​​गणना में जो पीआईडी ​​आप उठाते हैं वह वर्तमान थ्रेड द्वारा शुरू की गई प्रक्रिया का पीआईडी ​​है या पीआईडी आपके द्वारा चुने गए प्रक्रिया को हमारे ऐप द्वारा भी बनाया गया था (हो सकता है कि होस्ट सिस्टम पहले से ही उस प्रक्रिया को चला रहा हो)।

कहा जा रहा है कि, यदि आप दर्जनों प्रक्रियाओं या मूल प्रक्रिया को उत्पन्न नहीं कर रहे हैं, तो आप वास्तव में अद्वितीय हैं (कुछ कस्टम उपयोग जो आप अपने ऐप के साथ भेजते हैं) तो यह दृष्टिकोण ठीक काम करता है जिस स्थिति में मूल प्रक्रिया का पीआईडी आप जो चाहते हैं उसे ढूंढ रहे हैं।

खिड़कियों पर आप 'कार्यसूची' के रूप में उपयोग कर सकते हैं Jhurtado ने बताया PIDs की पूरी सूची प्राप्त करके इच्छित (/ FI फिल्टर स्विच का उपयोग परीक्षण में मेरे लिए काम नहीं किया था) के लिए फिल्टर करने के लिए।

किसी भी * निक्स सिस्टम पर आप "ps ax | grep" का उपयोग कर सकते हैं, जहां NAME कुछ प्रक्रिया नाम है जैसे 'nginx' या 'httpd' जिसे आप अपनी सूची प्राप्त करने के लिए फ़िल्टर करना चाहते हैं।

ही, यदि आप आवारा प्रक्रियाओं * nix आप बेशक उपयोग "मार -9" की और Windows पर कर सकते हैं पर (वीएम बाहर निकलने पर, उदाहरण के लिए) को मारने के लिए की जरूरत है, काफी दिलचस्प है, तो आप उपयोग कर सकते हैं 'taskkill '।

दुर्भाग्यवश दुर्भाग्य से इष्टतम।

0

मैं आपके जैसा ही मुद्दा चलाता हूं।मुझे एक सुंदर सभ्य समाधान मिला, मैंने यह सुनिश्चित करने से पहले थोड़ा सा नींद की सिफारिश की कि प्रक्रिया आधिकारिक तौर पर शुरू हो गई है।

Process p = Runtime.getRuntime().exec("cmd /c tasklist"); 
StringWriter writer = new StringWriter(); 
IOUtils.copy(p.getInputStream(), writer); 
String theString = writer.toString(); 
//System.out.println(theString); 
id = findLastString("javaw.exe      .{1,} Console     1", theString); 
System.out.println(id); 

जहां findLastString रूप

public static String findLastString(String pattern, String in) { 
    Pattern p = Pattern.compile(pattern); 
    Matcher matcher = p.matcher(in); 
    String it= ""; 
    while(matcher.find()) { 
     it = matcher.group(); 
     try { 
     Thread.sleep(10); 
     } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     } 
    } 
    int firstIndex=pattern.indexOf(".{1,}"); 
    int lastIndex=it.substring(firstIndex).indexOf(pattern.substring(pattern.indexOf(".{1,}")+5))+firstIndex; 
    String dotOn = it.substring(pattern.indexOf(".{1,}")); 

    it=it.substring(firstIndex, lastIndex); 
    return it; 
} 

परिभाषित किया गया है मूल रूप से इस चल रही प्रक्रियाओं की सूची उपलब्ध करवाई जाएंगी, और पाते हैं सबसे हाल ही के साथ एक भाग गया, इस उदाहरण में, नाम javaw.exe (मेरे कार्यक्रम एक अलग जावा प्रक्रिया शुरू कर रहा था)। आप प्रक्रिया के नाम से javaw.exe को प्रतिस्थापित कर सकते हैं, जिसे आप कार्य प्रबंधक का उपयोग करके पा सकते हैं। आपको अपाचे आम आईओ जार भी प्राप्त करने की आवश्यकता होगी।

संबंधित मुद्दे

 संबंधित मुद्दे