2015-01-14 14 views
6

का उपयोग कर सामान्य रूप से बनाई गई प्रक्रिया को कैसे समाप्त करें मैं अपने जावा एप्लिकेशन में प्रोसेसबिल्डर का उपयोग कर प्रक्रियाएं बना रहा हूं। बनाई गई प्रक्रिया कुछ FFMPEG आदेश निष्पादित करती है जो वास्तव में निर्दिष्ट गंतव्य मीडिया फ़ाइल में RTSP धाराओं की प्रतिलिपि बनाते हैं।प्रोसेसबिल्डर

ProcessBuilder builder = new ProcessBuilder("ffmpeg", "-i", RTSP_URL, "-f", fileFormat, destFilePath); 
Process processToExecute = builder.start(); 

मैं इसे निष्पादित करने से पहले प्रक्रिया को बंद करना चाहता हूं। इसलिए, यदि मैं सीधे विंडोज सीएमडी में यह एफएफएमपीईजी कमांड चलाता हूं और फिर 5 सेकंड के बाद 'CTRL + C' दबाता हूं तो प्रक्रिया स्थिति '2' के साथ समाप्त हो जाती है। और मैं अब तक बनाई गई मीडिया फाइल चला सकता हूं।

तो, अगर मैं अपने जावा आवेदन में एक ही आपरेशन का उपयोग कर: मैं स्थिति कोड प्राप्त

process.destroy(); //I call this method after 5 sec 

'1' जो असामान्य समाप्ति का मतलब है। मैं निम्नलिखित तरीके से स्थिति प्राप्त:

processToExecute.destroy(); 
processToExecute.exitValue(); //This return me status '1' 

और मैं मीडिया फ़ाइल नहीं कर सकते हैं और मुझे लगता है कि इस प्रक्रिया के असामान्य समाप्ति के कारण है।

तो मैं प्रोसेसबिल्डर का उपयोग करके बनाई गई प्रक्रिया को कैसे समाप्त कर सकता हूं उसी तरह से हम सीएमडी (CTRL + C) में करते हैं ताकि मैं बनाई गई मीडिया फ़ाइल चला सकूं?

मैं जावा एप्लिकेशन में प्रोसेसबिल्डर का उपयोग कर प्रक्रिया को समाप्त करना चाहता हूं, जब मैं सीएमडी का उपयोग कर प्रक्रिया समाप्त करता हूं तो मुझे प्राप्त होता है।

संपादित करें # 01: --- शेयरिंग निष्कर्ष

तो, जब मैं एक बार एप्लिकेशन को समाप्त कर देता है कि फाइल को हटाने का प्रयास, मैं निम्नलिखित त्रुटि मिलती है:

The Action Can't be Performed Because File is Opened in FFMPEG.exe 

जिसका मतलब है कि इस प्रक्रिया को समाप्त नहीं किया गया है आदेश यह निष्पादित कर रहा है। उस आदेश ने अभी भी इस फाइल पर कब्जा कर लिया है इसलिए मैं इसे खेलने में सक्षम नहीं हूं।

processToExecute.destroy(); 

लेकिन, काम यह प्रदर्शन कर रहा है (कि एक आदेश के निष्पादन है) अभी भी सक्रिय है: प्रक्रिया समाप्त जब मैं फोन हो जाता है। अजीब!!!!

संपादित करें # 02: शेयरिंग परम कारण

वास्तव में अगर मैं सीधे 'CTRL + C' या 'q' प्रेस cmd में जब प्रक्रिया तो चल रहा है यह प्रक्रिया सफलतापूर्वक समाप्त हो जाता है और इस प्रक्रिया में कोई अधिक दिखाई देता है है वर्तमान में प्रक्रिया सूचियों को निष्पादित करना।

cmd> processToExecute.destroy(); 

यह प्रक्रिया समाप्त हो जाता है लेकिन जब मैं वर्तमान में क्रियान्वित प्रक्रियाओं की सूची को देखने के मैं अभी भी वहाँ पर उन्हें देख सकते हैं:

और प्रोग्राम के जब मैं विधि कॉल।

और वही परिदृश्य मौजूद है यदि मैं अपने कार्य या पिड को निर्दिष्ट करके 'टास्ककिल' या 'मार' कमांड कमांड का उपयोग करके इस प्रक्रिया को समाप्त करने का प्रयास करता हूं जो अभी भी असामान्य रूप से समाप्त हो जाता है।

पीएसमैं निम्न आदेश का उपयोग चल रहे प्रक्रियाओं को देखने के लिए:

tasklist 
इस से

तो यह साबित करता है कि नष्ट() आवेदन से विधि और 'taskkill या मारने के' एक और अध्यक्ष एवं प्रबंध निदेशक से आदेश की प्रक्रिया समाप्त नहीं है सामान्य रूप से है कि दबाने 'CTRL + सी 'और' क्यू 'करता है।

+0

मैं अगर आप जावा में ऐसा कर सकते हैं पता नहीं है, लेकिन आपके विवरण के आधार पर, आपको FFMPEG को नियंत्रण-सी सिग्नल भेजने की आवश्यकता है। ऐसा करने के लिए Win32 API कॉल [GenerateConsoleCtrlEvent] है (http://msdn.microsoft.com/en-us/library/windows/desktop/ms683155%28v=vs.85%29.aspx)। संयोग से, समस्या प्रति स्टेटस कोड नहीं है, यह सिर्फ एक और लक्षण है; स्थिति कोड 2 के साथ प्रक्रिया को समाप्त करना स्थिति कोड 1 के साथ इसे समाप्त करने के लिए अलग नहीं है। आपको * इसे * समाप्त करने के लिए * इसे करने के लिए मजबूर करना होगा (ताकि इसे अपनी सफाई दिनचर्या चला सकें। –

+0

यदि यह ffmpeg है, तो इसे छोड़ने के लिए इसे 'क्यू' कुंजी भेजें ... – rogerdpack

+0

हाँ यदि मैं cmd ​​के माध्यम से 'q' भेजता हूं तो यह सामान्य रूप से प्रक्रिया समाप्त कर देता है। लेकिन मैं इसे अपने आवेदन के अंदर से समाप्त करना चाहता हूं। –

उत्तर

-2

शायद कोशिश ...

builder.inheritIO(); 
System.exit(2); 

या आप प्रक्रिया के stdin के लिए लिखने की कोशिश कर सकता है ...

process.getInputStream().write(exitCode); 
+0

जावा में 'प्रक्रिया' कक्षा के लिए ऐसी कोई 'विरासत()' विधि नहीं है। प्रोसेसबिल्डर बिल्डर = नया प्रोसेसबिल्डर (कमांड); प्रक्रिया प्रक्रिया ToExecute = builder.start(); –

+0

प्रिय फिर से इनपुटस्ट्रीम पर कोई 'लेखन()' विधि नहीं है। हम इनपुटस्ट्रीम से पढ़ सकते हैं जबकि हम आउटपुटस्ट्रीम पर लिख सकते हैं। और आउटपुटस्ट्रीम के साथ इसका कोई मतलब नहीं है। –

+0

उन्होंने गलत तरीके से लिखा, वह 'process.getOutputStream() लिखते हैं। लिखें (exitCode) '। चूंकि getInputStream() 'subprocess के STDOUT से कनेक्ट रीडोनली स्ट्रीम देता है। जबकि 'getOutputStream() 'उपप्रवाह के एसटीडीआईएन से जुड़ा हुआ स्ट्रीम लौटाता है। – Sneg

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

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