هل من الممكن أن تقتل آلة جافا الافتراضية من آخر ظاهري ؟

StackOverflow https://stackoverflow.com/questions/63758

  •  09-06-2019
  •  | 
  •  

سؤال

يجب تطبيق جافا التي تطلق آخر تطبيق جافا.قاذفة لديه رقيب الموقت يتلقى الإخطارات الدورية من الثاني VM.ومع ذلك ، إذا لم يتم تلقي الإخطارات ثم الثانية ظاهري ينبغي أن يكون قتل قاذفة أداء بعض إضافية أنشطة التنظيف.

السؤال هو, هل هناك أي طريقة للقيام بذلك فقط باستخدام جافا ؟ حتى الآن لا بد لي من استخدام بعض أساليب الأصلي لتنفيذ هذه العملية وذلك على نحو ما هو قبيح.

وذلك بفضل!

هل كانت مفيدة؟

المحلول

ربما أنا في عداد المفقودين شيء ولكن لا يمكنك الاتصال destroy() الطريقة على Process كائن عاد قبل Runtime.exec()?

نصائح أخرى

يمكنك استخدام java.لانغ.عملية أن تفعل ما تريد.مرة واحدة كنت قد أنشأت متداخلة العملية و يكون إشارة إلى عملية سبيل المثال ، يمكنك الحصول على المراجع القياسية و يخطئ تيارات.يمكنك مراقبة دورية تلك ، والدعوة .تدمير() إذا كنت ترغب في إغلاق العملية.كل شيء قد تبدو شيئا مثل هذا:

Process nestedProcess = new ProcessBuilder("java mysubprocess").start();
InputStream nestedStdOut = nestedProcess.getInputStream(); //kinda backwards, I know
InputStream nestedStdErr = nestedProcess.getErrorStream();
while (true) {
    /*
       TODO: read from the std out or std err (or get notifications some other way)
       Then put the real "kill-me" logic here instead of if (false)
    */
    if (false) {
        nestedProcess.destroy();
        //perform post-destruction cleanup here
        return;
    }

    Thread.currentThread().sleep(1000L); //wait for a bit
}

ويساعد هذا الأمل ،

شون

يمكنك أيضا نشر الخدمة (عبر الخيش, هسه, الخ) على الثاني JVM أن يدعو النظام.exit() وتستهلك من الوكالة الدولية للطاقة JVM.إذا كنت فقط أريد أن أغلق الثانية JVM أسفل عندما يتوقف عن إرسال هذه الإخطارات الدورية, قد لا يكون في حالة الرد على المكالمة الخدمة.

داعيا الأوامر قذيفة مع جافا.لانغ.وقت التشغيل.exec() هو على الأرجح أفضل رهان.

الطريقة المعتادة للقيام بذلك هي دعوة عملية.تدمير()...ومع ذلك فمن غير مكتملة الحل منذ متى باستخدام الشمس JVM على *nix تدمير الخرائط على SIGTERM التي ليست مضمونة إلى إنهاء العملية (التي تحتاج SIGKILL كذلك).والنتيجة النهائية هي أنه لا يمكنك أن تفعل الحقيقي في إدارة العملية باستخدام جافا.

هناك بعض البق المفتوحة حول هذا الموضوع انظر:وصلة النص

java.لانغ.عملية waitFor() طريقة تنتظر عملية الموت و تدمير() طريقة لقتل subprocess.

طيب تطور من جوهر هو على النحو التالي:

كنت تستخدم عملية API لإغلاق الثانية ظاهري ، ولكن هذا لن يجدي.

والسبب هو أن بلدي التطبيق الثاني هو الكسوف RCP تطبيق وأنا أطلقت عليه باستخدام eclipse.exe قاذفة المدرجة.

ومع ذلك, هذا يعني أن عملية API تدمير() الأسلوب سوف تستهدف eclipse.exe العملية.قتل في هذه العملية يترك جافا عملية سالما.حتى واحد من زملائي هنا كتب تطبيق صغير الذي سوف يقتل التطبيق الصحيح.

حتى واحد من الحلول استخدام عملية API (و إزالة زائدة الأوسط الخطوات) هو الحصول على بعيدا مع الكسوف قاذفة ، بعد أول آلة افتراضية مكررة جميع وظائفه.

اعتقد انني سوف تضطر إلى الحصول على العمل.

يجب أن تكون قادرة على القيام بذلك جافا.لانغ.وقت التشغيل.المدير التنفيذى الأوامر قذيفة.

يمكنك الحصول على كود جافا الكشف عن المنصة في وقت التشغيل و النار قبالة منصة قتل في عملية القيادة.هذا هو حقا الصقل على الحل الحالي.

هناك أيضا العملية.تدمير(), إذا كنت تستخدم ProcessBuilder API

ليس بالضبط عملية الإدارة ، ولكن يمكن أن تبدأ rmi الخادم في آلة جافا الافتراضية تقوم بإطلاق ، ربط بعيد سبيل المثال مع الأسلوب الذي يفعل ما تنظيف المطلوبة ويدعو النظام.exit().الأول يمكن vm ثم استدعاء هذا الأسلوب البعيد إلى إيقاف تشغيل الجهاز الظاهري الثاني.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top