उबंटू SIGTERM को शटडाउन पर नहीं भेज रहा है


21

मुझे संदेह होने लगा है कि उबंटू चल रहे अनुप्रयोगों को नहीं बता रहा है कि यह उन्हें सही ढंग से छोड़ने के लिए बंद कर रहा है, बल्कि उन्हें छोड़ने के लिए मजबूर करता है।

अगर मैं क्रोम को खुला छोड़ देता हूं, तो यह कहता है कि यह पिछली बार सही ढंग से बंद नहीं हुआ था जब मैंने इसे बूट के बाद फिर से खोला, लिबरऑफिस ने मुझसे नहीं पूछा कि क्या मैं अपने दस्तावेज़ को सहेजना चाहता हूं और मैं एक आवेदन कर रहा हूं जिसे कुछ कोड चलाने की आवश्यकता है बाहर निकलने पर ऐसा करने की अनुमति नहीं है, जब कंप्यूटर बंद हो जाता है।

जैसा कि मैंने इसे समझा है, SIGTERM को सभी प्रक्रियाओं के लिए पहले भेजा जाता है ताकि वे सफाई से बाहर निकल सकें और यदि वे बाहर नहीं निकलते हैं तो उन्हें छोड़ने के लिए मजबूर करने के लिए भेजा जाता है। ऐसा लगता है कि उबंटू या तो SIGTERM नहीं भेज रहा है या SIGKILL भेजने से पहले पर्याप्त समय नहीं देता है।

क्या कोई तरीका है जिससे मैं इसे ठीक कर सकता हूँ?

मैं Ubuntu 16.04 चला रहा हूँ, लेकिन समस्या 15.10 में भी मौजूद है। मैं यह नहीं बता सकता कि अगर मैं उबंटू का उपयोग करना शुरू करता हूं, तो 15.10 सबसे नया संस्करण था।

संपादित करें: मैं एकता का उपयोग करता हूं और अपने कंप्यूटर को ऊपरी दाएं कोने में गियर दबाकर और शट डाउन का चयन करके बंद कर देता हूं, हालांकि sudo haltटर्मिनल में चलने पर समस्या समान है ।

संपादित करें: मैं एक ही व्यवहार देख रहा हूं जब केवल लॉग आउट कर रहा हूं। मेरा अनुमान है कि सिग्नल को लॉग आउट पर भेजा जाना है और इसलिए समस्या शटडाउन पर उत्पन्न होती है और लॉग आउट होती है।


आप कैसे बंद कर रहे हैं?
टेराडॉन

1
क्रोमियम और लिबरऑफिस SIGTERM को नहीं संभाल रहे हैं जिस तरह से आप इसे संभालना चाहते हैं
एंड्रिया कोरबेलिनी

2
मुझे यकीन नहीं है कि मैं समझ सकता हूं कि आपका क्या मतलब है। क्या आपका मतलब है कि वे SIGTERM को सही तरीके से नहीं संभाल रहे हैं? शायद वे नहीं करते, लेकिन जैसा कि मैंने अपने प्रश्न में लिखा था कि मैं एक ऐसे कार्यक्रम पर काम कर रहा हूं जो SIGTERM को संभालता है, लेकिन वह कोड कभी नहीं लगता है। Ctrl + C दबाने पर SIGINT पूरी तरह से काम करता है। मुझे अभी भी विश्वास है कि उबंटू को बंद करने की प्रक्रियाओं को अधिसूचित करने के संबंध में कुछ समस्या है।
GKraft


2
यह सभी अनुप्रयोगों को मैन्युअल रूप से बंद करने के लिए कष्टप्रद है, और अगर आप एक न्यूनतम भूल जाते हैं तो क्या होगा? यह आपके काम को बचाने के लिए अभ्यस्त है। और बहुत सारी पृष्ठभूमि प्रक्रियाएँ हैं जिन्हें आप या तो आसानी से नियंत्रित नहीं कर सकते हैं या जिनके बारे में नहीं सोचते हैं। उन्हें खुद के बाद सफाई करने या जो कुछ भी वे कर रहे थे उसे बचाने का मौका नहीं दिया जाएगा।
GKraft

जवाबों:


3

दुर्भाग्य से, यह इस तरह से काम नहीं करता है। उन कार्यक्रमों में से कई जो वास्तव में एक सिग्नल हैंडलर हैं, पुष्टि डायलॉग दिखाने के लिए सिग्नल को ब्लॉक नहीं करते हैं। सिग्नल हैंडलिंग अक्सर न्यूनतम या गायब होती है।

आप इसे शटडाउन किए बिना आसानी से आज़मा सकते हैं। बस अपने चल रहे फ़ायरफ़ॉक्स या लिबर ऑफिस प्रक्रिया में SIGTERM भेजें:

$ pkill firefox

आम तौर पर, फ़ायरफ़ॉक्स पूछ सकता है कि क्या आप वास्तव में इसे बंद करना चाहते हैं। इसके अलावा, आमतौर पर इसे बंद करने में कुछ समय लगता है, खासकर जब यह लंबे समय से चल रहा हो और 1 जीबी से अधिक रैम का उपयोग कर रहा हो - इसकी अंतिम विंडो बंद होने के बाद प्रक्रिया को समाप्त करने में अक्सर एक मिनट का समय लगता है। जब आप SIGTERM भेजते हैं, तो ऐसा कुछ नहीं होता है, यह प्रक्रिया तुरंत समाप्त हो जाती है।

हालाँकि, कुछ डेस्कटॉप वातावरण बंद करने से पहले सभी खुली हुई विंडो बंद कर देते हैं। SIGTERM के विपरीत, विंडो को प्रोग्रामेटिक रूप से बंद करना उस विंडो के X बटन पर क्लिक करने जैसा है, या Alt+ F4। यह भी है कि अन्य उत्तर में स्क्रिप्ट क्या करता है - यह सभी खुली खिड़कियों को इनायत से बंद करने के लिए wmctrl का उपयोग करता है।

जब कोई विंडो बंद होती है, तो प्रोग्राम जल्दी में नहीं होता है और यह उस विंडो के भीतर सब कुछ बंद कर सकता है, उदाहरण के लिए ओपन टैब, और यह एक विंडो को डायलॉग भी दिखा सकता है अगर वहाँ कोई काम नहीं है। एक बार जब किसी एप्लिकेशन की सभी खुली हुई खिड़कियां बंद हो जाती हैं, तो प्रक्रिया आमतौर पर उसके तुरंत बाद समाप्त हो जाती है।

तो यह आपके डेस्कटॉप वातावरण पर निर्भर करता है (यह मानते हुए कि आप अपने डेस्कटॉप वातावरण को बंद करने के लिए उपयोग करते हैं और नहीं sudo poweroff)। उदाहरण के लिए, केडीई को खुली खिड़कियों के बंद होने से पहले बंद होने का इंतजार करना चाहिए, जबकि मेट नहीं है।

नीचे पंक्ति: बंद करने से पहले सभी खुली हुई खिड़कियों को मैन्युअल रूप से बंद करें। या एक डेस्कटॉप वातावरण का उपयोग करें जो सभी खिड़कियों के बंद होने की प्रतीक्षा करता है।


मुझे लगता है कि शटडाउन प्रक्रिया और सिग्नल हैंडलिंग ठीक से काम नहीं किया जैसा मैंने सोचा था। अब मैं समझता हूं कि यह कैसे काम करना चाहिए और जैसा मैंने उम्मीद की थी, यह काम नहीं किया।
GKraft

0

इसके लायक क्या है, कुछ समय पहले, मुझे यह प्रक्रिया मंज़रो मंच पर मिली है:

close_apps () {
WIN_IDs=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
for i in $WIN_IDs; do wmctrl -ic "$i"; done

# Keep checking and waiting until all windows are closed
while [ "$WIN_IDs" != "" ]; do
        sleep 0.1;
        WIN_IDs=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
done

}

आप इसे बंद करने (या फिर से शुरू करने) से पहले सभी खुले एप्लिकेशन को बंद करने के लिए अपनी खुद की स्क्रिप्ट में कॉल कर सकते हैं।

एकमात्र समस्या होने के नाते, इसे Xfce के लिए बनाया गया था, इसलिए इसे उन परिवर्तनों की आवश्यकता है जो यूनिटी डीई लगाता है। ओपी की समस्या को हल करने में मदद के लिए किसी और जानकार से थोड़ी मदद यहां अच्छी तरह से आएगी।


मेरे पास कुछ दिनों के लिए मेरे कंप्यूटर तक पहुंच नहीं होगी इसलिए मैं इसे ठीक करने की कोशिश नहीं कर सकता। क्या इस तरह की स्क्रिप्ट का उपयोग करना वास्तव में आवश्यक होना चाहिए? मुझे लगता है कि ubuntu shoukd इसे खुद से संभालती है।
GKraft

माना। यह पूरी तरह से Xubuntu में काम करता है, हालांकि। उदाहरण के लिए, शटडाउन अनिश्चितकाल तक प्रतीक्षा करेगा यदि कोई सहेजा हुआ दस्तावेज़ है।
एसआर

0

दरअसल, स्क्रिप्ट का एक हिस्सा जो सभी विंडोज़ को बंद करता है और किसी विशेष DE पर निर्भर नहीं करता है, आस्क पर उपलब्ध है। 2-एनडी और 3-आरडी उत्तर विशेष रूप से उपयोगी हैं। बस कुछ लाइनों के साथ, और पैनल या डेस्कटॉप पर लॉन्चर बनाकर आप उस डीएफ़ल शटडाउन को प्राप्त कर सकते हैं जो आपके द्वारा उपयोग किए जा रहे डीई में काम करता है।

कैसे सभी खुली खिड़कियों को इनायत से बंद करें


वे होनहार लगते हैं। मैं शायद एक समान स्क्रिप्ट का उपयोग करके समाप्त हो जाऊंगा।
GKraft
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.