मेरे नियमित कार्यक्रमों में से कई दुर्घटना (एक नियमित आधार पर) "उपयोगकर्ता परिभाषित संकेत 1" संदेश के साथ। मुझे पता है कि एक nohupकमांड है, लेकिन क्या कोई nousr1कमांड है? या ऐसा कुछ जो nohupयूएसआर 1 के साथ कुछ ऐसा करेगा लेकिन क्या होगा ?
मेरे नियमित कार्यक्रमों में से कई दुर्घटना (एक नियमित आधार पर) "उपयोगकर्ता परिभाषित संकेत 1" संदेश के साथ। मुझे पता है कि एक nohupकमांड है, लेकिन क्या कोई nousr1कमांड है? या ऐसा कुछ जो nohupयूएसआर 1 के साथ कुछ ऐसा करेगा लेकिन क्या होगा ?
जवाबों:
उपयोगिता के अनुरूप होने के लिए एक सरल हैकी समाधान nohup, लेकिन इसके लिए SIGUSR1, कोरूटिल्स स्रोत की एक प्रति प्राप्त करना होगा , इसे अनलोड करना, करना
sed -i 's/SIGHUP/SIGUSR1/' /path/to/coreutils/src/nohup.c
, वैकल्पिक रूप से आउटपुट फ़ाइल नाम भी बदलते हैं
sed -i 's/nohup\.out/nousr1.out/g' /path/to/coreutils/src/nohup.c
, इस स्रोत को संकलित करें और नव-संकलित nohupबाइनरी को इनस्टॉल करें /usr/bin/nousr1:
cp /path/to/coreutils/src/nohup /usr/bin/nousr1
इसके बाद, जैसा कि मैंने जांच की, इस संकेत से sleep 1000बाहर निकलता है USR1, जबकि nousr1 sleep 1000इस संकेत के लिए प्रतिरक्षा है।
nohupवैसे, मुख्य कार्यक्षमता , टर्मिनल से प्रक्रिया को अलग करना है, इसलिए इसे SIGHUPपहली जगह में नहीं भेजा जाता है। यह भी एक सिग्नल हैंडलर सेट करता है एक अतिरिक्त बोनस है, लेकिन अनावश्यक होना चाहिए।
signal(SIGHUP,SIG_IGN);कॉल हटाते हैं nohup.c, तो प्रक्रिया प्राप्त होगी SIGHUP। nohupसिग्नल को नजरअंदाज करने से अलग क्या होता है सिर्फ स्टड, स्टडआउट, स्टेडर डिस्क्रिप्टर को गैर-टर्मिनल फाइलों के रूप में फिर से खोलना। यह वास्तव में किसी विशेष तरीके से टर्मिनल से प्रक्रिया को अलग नहीं करता है। यानी, SIGHUPटर्मिनल के लटकने पर यह प्रक्रिया भेजी जाएगी । दूसरी तरफ बैश है, जो disownकमांड के साथ समान काम करता है , लेकिन मुझे यकीन नहीं है कि यह कैसे लागू किया जाता है - शायद आपके मतलब के तरीके में।
शेल trapनिर्मित कमांड के बारे में कैसे ?
trap 'echo "Thou shalt not USR1 me"' USR1
आपको trapरिक्त तर्क के साथ कमांड के रूप का उपयोग करने की आवश्यकता है । इसे इस्तेमाल करे:
trap '' SIGUSR1; myprogram
यह SIGUSR1 सिग्नल की अनदेखी करेगा जो आप करने की कोशिश कर रहे हैं। हालांकि मैं टिप्पणीकारों से सहमत हूं कि आंख मिलने से ज्यादा शायद यहां चल रहा है।
गलत फॉर्म:
trap 'echo ...' SIGUSR1; myprogram
अभी भी myprogramSIGUSR1 प्राप्त करने की अनुमति देगा लेकिन शेल फिर कमांड echoसे निष्पादित करेगा trap।
trap '' SIGUSR1; gvimdiff file1 file2और विम का "विम: कॉट डेडली सिग्नल यूएसआर 1" के साथ निधन हो गया।