2009-08-04 10 views
7

की तरह कैसे चलने दें मेरे पास एक जावा प्रोग्राम है जो यह सुनिश्चित करने के लिए लॉक फ़ाइल बनाता है कि कोई भी अन्य निष्पादन उसी समय चलता है। यदि प्रोग्राम चलता है तो यह फ़ाइल बनाता है, और बाहर निकलने पर, या तो सफल या अपवाद के माध्यम से, फ़ाइल हटा दी जाती है। लेकिन यदि उपयोगकर्ता Ctrl + C दबाता है, तो टर्मिनल को बंद करता है, या किसी अन्य तरीके से निष्पादन में बाधा डालता है, तो फ़ाइल हटाई नहीं जाती है। क्या इस इंटरप्ट कमांड का पता लगाने और यह सुनिश्चित करने के लिए कोई तरीका है कि इस मामले में फ़ाइल भी हटा दी गई है?जावा हैंडल सिस्टम इंटरप्ट्स को Ctrl + C

+0

विडंबना यह है कि, मैं इस प्रश्न के बारे में भूल गया और [उत्तर] (https://stackoverflow.com/a/34188676/113632) बाद में एक संबंधित छह साल (और वास्तविक वास्तविक अनुभव) से संबंधित था। @ अंबर बिल्कुल सही है कि अधिकांश जावा अनुप्रयोगों को शट डाउन हुक का उपयोग करना चाहिए, लेकिन वास्तव में * सिग्नल 'को संभालना चाहिए और अन्य सिग्नल जिन्हें आपको' sun.misc. सिग्नल 'का उपयोग करने की आवश्यकता है, जैसा कि लिंक किए गए प्रश्न में चर्चा की गई है। – dimo414

उत्तर

5

आप shutdown hooks पर देखना चाहते हैं।

How can I "intercept" Ctrl+C in a CLI application?

+0

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

+0

@mmyers, जो असामान्य की आपकी परिभाषा पर निर्भर करता है। :) Ctrl-C आम तौर पर उन्हें ट्रिगर करेगा। टर्मिनल बंद करना आमतौर पर नहीं करता है। – jsight

+1

ऐसे लॉकफाइल को हटाने के लिए कोई 100% मूर्ख तरीका नहीं है। उन्हें टाइमस्टैम्पिंग मदद कर सकती है, लेकिन यह डिस्क हर कुछ सेकंड लिखने की लागत पर आता है। बहुत से प्रोग्राम बस लॉकफाइल की खोज करते हैं और उपयोगकर्ता को इसके बारे में संकेत देते हैं। – Amber

2

इस से निपटने के लिए ही अच्छा तरीका है अपने लॉग फ़ाइल टाइमस्टैम्प के है:

इसके अलावा, यह शायद एक नकली या एक दिन से इस पिछले तो सवाल के निकट डुप्लिकेट या दो पहले है , और प्रत्येक कुछ सेकंड में एक नया टाइमस्टैम्प के साथ logfile अद्यतन करें। File.deleteOnExit मदद करेगा, लेकिन कोई विधि मूर्खतापूर्ण नहीं है (क्या होता है जब कोई पावर कॉर्ड खींचता है?)।

यदि आप टाइमस्टैम्प लिखते हैं, तो आप एक वैध टाइमस्टैम्प (हाल ही में लिखित) की जांच कर सकते हैं और लॉग फ़ाइल को ओवरराइट कर सकते हैं यदि यह बहुत बुरी तरह से पुराना है। इस तरह एक स्टेल लॉकफाइल उपयोगकर्ता के रास्ते में नहीं मिलेगा।