Cider: المتبقي JVM بعد الانسحاب

تم إنشاؤها على ٢٠ أكتوبر ٢٠١٣  ·  26تعليقات  ·  مصدر: clojure-emacs/cider

كلما تركت emacs أو قمت بتشغيل nrepl-quit ، أحصل على عملية JVM المعزولة المتبقية.

يجب أن تكون المرفقة صورة توضح شجرة عملية emacs بعد تشغيل nrepl-jack-in.

لقد اختبرت أيضًا مع CIDER 20131018.1553 من ملف .emacs.d جديد باستخدام وضع عصير التفاح / clojure فقط وواجهت نفس المشكلة.

nrepl-jvm-bug

bug help wanted

التعليق الأكثر فائدة

لا أفهم حقًا سبب إغلاق هذه المشكلة. إنها مشكلة كبيرة ، ولم يتم حلها في Emacs 24.5 لنظام التشغيل Windows.

أنا حاليا أستخدم هذا الحل البديل في .emacs

(defun my-kill-java ()
  (interactive)
  (cider-interactive-eval "(System/exit 0)")
  )

(defun turn-on-my-clojure-commands ()
   :
    (define-key clojure-mode-map (kbd "C-c q") 'my-kill-java)

  )

(add-hook 'clojure-mode-hook 'turn-on-my-clojure-commands)

ال 26 كومينتر

يبدو أن تعليق Stack Overflow يشير إلى أن الخطأ موجود منذ أبريل على الأقل.

سأحقق في المشكلة. قد يكون شيئًا متعلقًا بـ Windows ، على الرغم من ذلك - لأنني لا أعتقد أنني رأيت عمليات يتيمة على OSX و Linux.

يجب أن يكون هذا شيئًا خاصًا بنظام Windows ، حيث لا يمكنني إعادة إنتاجه على OSX.

يسعدني مساعدتك في تصحيح المشكلة إذا لم يكن لديك تثبيت Windows في متناول يديك.

ربما تجدر الإشارة إلى أنني لا أحصل على هذه المشكلة مع أي برامج أخرى تنتج نسخة من JVM. على سبيل المثال ، ينتج Leiningen نفس بنية العملية ولكن يتم إنهاء كلتا عمليتي java.exe عند الخروج.

يجب عليك تصحيح ما يحدث في cider--close-buffer عندما يتم تجاوز المخزن المؤقت للاتصال. يمكنك استخدام الأداة باستخدام C-u C-M-x واستدعاء cider-quit . يجب أن يقتل delete-process عادةً عملية Java الأساسية ، ولكن لسبب ما يبدو أن هذا لا يحدث على Windows.

لست على دراية كافية بـ nrepl.el / CIDER أو elisp لمعرفة ما يجب أن أبحث عنه.

يبدو أن عملية java.exe الأصل _is_ يتم قتلها ، ليس فقط الطفل لسبب ما.

drguildo قد يكون خطأً في Emacs بعد ذلك ، نظرًا لأن delete-process هي وظيفة أساسية في Emacs. قد تحصل على مزيد من المعلومات بخصوص هذا إذا قمت بنشر سؤال في القائمة البريدية emacs-devel.

لقد قدمت خطأ في Emacs وهذا ما قاله أحد المطورين:

يمكن لـ Emacs على Windows فقط مراقبة عملياته الفرعية المباشرة وقتلها ، ولا يمكنه مراقبة ، ناهيك عن قتل ، أي من العمليات التابعة له ، لأنه ليس لديه فكرة عنها. ونظام التشغيل لا يقتل تلقائيًا جميع العمليات في شجرة العمليات الفرعية ، ولا توجد طريقة لإرسال إشارة إليهم جميعًا ، كما هو الحال في منصات Posix. إذا لم تتسبب عملية قتل الطفل الفوري في خروج بعض الأبناء أو إجهاضهم ، فسيتم ترك هؤلاء الأحفاد أيتامًا.

لماذا لا يخرج الطفل java.exe عندما يفعل الوالد؟ هل يمكنك الترتيب لحدوث ذلك؟ إذا تعذر ذلك ، لا أعتقد أن هناك حلًا لهذه المشكلة ، آسف.

لذلك كنت محقًا عندما افترضت أن هذا "خطأ" متعلق بنظام Windows. نظرًا لأنني لا أستخدم Windows ، فأنا لا أعرف ما يمكننا القيام به في هذه المرحلة. أعتقد أننا بحاجة إلى بعض التتبع الصريح للعمليات هناك ، ولكن سيتعين على شخص آخر تنفيذه.

إذا قمت بتشغيل (النظام / الخروج 0) في REPL ، فسيتم إنهاء جميع عمليات Java. هل من الممكن أن تفعل هذا أو شيء مشابه في عصير التفاح - عازلة قريبة؟

أعتقد أننا نستطيع. أتساءل عما إذا كانت هناك حلول أبسط لهذه المشكلة.

IMHO على افتراض أن نظام التشغيل سوف يقتل عملية الطفل إذا لم يكن الخروج بسيطًا ، فهو أمر مهمل. تصويتي هو لإغلاق أي جهاز افتراضي مملوك بشكل صريح عند إيقاف تشغيل المضيف ، والنظر في أي شيء تم إنشاؤه عبر Jack-in على أنه ملك.

noisesmith ربما كنت على حق. من ناحية أخرى ، لا أتذكر أنني رأيت شخصًا يتتبع صراحة معالجة الطفل في كود Emacs Lisp. سوف أنظر في ذلك.

drguildo قام أحد أصدقائي (وهو مخترق Windows مجنون) بفحص هذا الادعاء على emacs-devel وقام بإنشاء رقعة هنا .

ليس لدي أي خبرة هنا حقًا ، لكن دعني أضيف روابط إلى مشكلتين رأيتهما قد تكون ذات صلة. هناك مشكلة مماثلة مع JVMs المعزولة في Gorilla REPL على Windows:

https://github.com/JonyEpsilon/lein-gorilla/issues/4

حققjtcb قليلاً ، ولديه سبب وجيه للاشتباه في أنها مشكلة لينينجين:

https://github.com/technomancy/leiningen/issues/1614

إغلاق هذا لأنه لا يوجد الكثير مما يمكننا فعله حيال ذلك.

لا أفهم حقًا سبب إغلاق هذه المشكلة. إنها مشكلة كبيرة ، ولم يتم حلها في Emacs 24.5 لنظام التشغيل Windows.

أنا حاليا أستخدم هذا الحل البديل في .emacs

(defun my-kill-java ()
  (interactive)
  (cider-interactive-eval "(System/exit 0)")
  )

(defun turn-on-my-clojure-commands ()
   :
    (define-key clojure-mode-map (kbd "C-c q") 'my-kill-java)

  )

(add-hook 'clojure-mode-hook 'turn-on-my-clojure-commands)

تم إغلاقه لأنها ليست مشكلة عصير التفاح ، إنها مشكلة إيماكس (أو لين).

حسنًا ، ولكن ربما يجب أن نخبر المستخدمين على الأقل عن حل بديل؟ ستقتل عمليات جافا المعلقة الآلة ، وسيقتل أمر عام مثل "pskill java" أيضًا قواعد البيانات مثل datomic و cassandra.

كيف أقوم بتعيين الأمر لـ repl أيضًا ، أي ما هو اسم خريطة clojure-repl-mode-map؟

حسنًا ، ولكن ربما يجب أن نخبر المستخدمين على الأقل عن حل بديل؟ ستقتل عمليات جافا المعلقة الآلة ، وسيقتل أمر عام مثل "pskill java" أيضًا قواعد البيانات مثل datomic و cassandra.

عادةً ما أفحص جميع عمليات Java وأقتل العمليات ذات الصلة. نظرًا لأن عمليات إعادة التشغيل غير شائعة ، لا أعتقد أن هذه مشكلة كبيرة على أي حال.

كيف أقوم بتعيين الأمر لـ repl أيضًا ، أي ما هو اسم خريطة clojure-repl-mode-map؟

cider-repl-mode-map .

أعتقد أن القيام بـ (وكلاء إيقاف التشغيل) يتيح لـ jvm الإنهاء من تلقاء نفسه على windows. أعتقد أن windows JVM هو الذي يبدأ بعض مؤشرات الترابط غير الخادم التي تمنع الخروج العادي بعد ذلك. أتمنى أن أتذكر المشروع الذي قرأت فيه هذه المعلومات (ربما Nightcode ، ربما Ring-jetty ، غير متأكد).

لقد قمت بحلها عن طريق استدعاء (النظام / الخروج 0) من داخل البديل.

أضفت أمرًا إلى .emacs

(defun my-kill-java ()
  (interactive)
  (cider-interactive-eval "(System/exit 0)")
  )
 (define-key cider-repl-mode-map (kbd "C-c C-q") 'my-kill-java)

إذا اتصلت للتو (وكلاء إيقاف التشغيل) ، فسيظل pskill يجد عمليتي جافا لقتلهما. هذا لا يحدث عند استخدام (النظام / الخروج 0)

لقد تأثرت بالكود قليلاً. الحلول المذكورة أعلاه باستخدام كتلة عصير التفاح التفاعلية ، وأحيانًا تترك مخازن تفاعل عصير التفاح اليتيمة. الكود التالي جعل إيقاف التشغيل الخاص بي موثوقًا به بشكل جيد:

(defun my-kill-java ()
  (interactive)
  (cider-nrepl-send-unhandled-request
   (list "op" "eval"
         "code" "(do 
                   (.start 
                     (Thread. 
                       (fn [] 
                         (Thread/sleep 5000)
                         (shutdown-agents)
                         (System/exit 0)))) 
                  nil)"))
  (cider-quit 'QUIT-ALL))

من المفترض أن benedekfazekas قد أصلح هذا مؤخرًا مع https://github.com/benedekfazekas/cider/commit/7cd9c7032f6c65869d5a1ba1e4292f4375585cf2

رأيت ذلك ، لكنني لم أفكر في اختباره. سأختبر وأؤكد. شكرا لك!

الإصلاح يبدو جيدا بالنسبة لي. جميع الحالات التي كانت تترك جهاز vm قيد التشغيل ، الآن لا تفعل ذلك.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات