.Bashrc में इंटरेक्टिव कमांड (जैसे स्क्रिप्ट) का उपयोग करते समय कांटा बम को रोकें


4

मैं अक्सर टर्मिनल का आउटपुट लॉग करना चाहता हूं। इसलिए मैंने सेट करने की कोशिश की script स्टार्टअप पर चलाने के लिए; मेरे .bashrc फ़ाइल में मैंने:

script ~/Logs/$(date "+%Y-%m-%d.%H-%M-%S")

क्योंकि मेरी .bashrc फ़ाइल में कमांड्स तब भी चलाए जाते हैं जब मैं एक इंटरैक्टिव टर्मिनल खोलता हूं, मुझे लगता है कि यह वही होगा जो मैं चाहता था।

हालाँकि, क्योंकि script अपने निष्पादन के दौरान स्वयं एक नया टर्मिनल खोलता है, मैंने इसके बजाय एक कांटा बम के साथ समाप्त किया:

Last login: Sat May  9 12:02:43 on ttys001
Script started, output file is /Users/mchenja/Logs/2015-05-09.12-14-37
Script started, output file is /Users/mchenja/Logs/2015-05-09.12-14-37
Script started, output file is /Users/mchenja/Logs/2015-05-09.12-14-37
Script started, output file is /Users/mchenja/Logs/2015-05-09.12-14-37
Script started, output file is /Users/mchenja/Logs/2015-05-09.12-14-37
Script started, output file is /Users/mchenja/Logs/2015-05-09.12-14-37
[mchenja@mycomp ~]$

कैसे सुनिश्चित करने के लिए कोई सुझाव script जब मैं एक नया इंटरेक्टिव टर्मिनल खोलता हूं तो यह एक बार चलाया जाता है

अगर यह मायने रखता है, तो यह ओएस एक्स पर है, हालांकि मेरा मानना ​​है कि लिनक्स में भी यही बात होगी।

जवाबों:


1

मैं "गार्ड चर" और आपकी स्थिति के माध्यम से @ टॉमस डिक्की के उत्तर पर प्रतिबिंबित हुआ। यहां कुछ मुश्किल चीजें चल रही हैं और यह आपके पर्यावरण पर निर्भर करता है।

यदि आप लॉग इन करते हुए, एक्स विंडोज़ चला रहे वर्कस्टेशन में लॉग इन करते हैं, तो .bash_profile फ़ाइल पढ़ी जाती है (आमतौर पर, हालांकि मैं लिनक्स के सभी संस्करणों के बारे में निश्चित रूप से नहीं कह सकता; यह आपके लॉगिन शेल पर भी निर्भर करता है)। वह आपकी शुरुआत करेगा script सत्र, तो यह एक बुरी बात है। इसके अलावा, जब आप X के भीतर से टर्मिनल में लॉग इन करते हैं, तो नहीं होगा पढ़ना .bash_profile, लेकिन सिर्फ .bashrc, जब तक आप टर्मिनल सॉफ़्टवेयर को बश बताने के लिए कहते हैं कि यह एक लॉगिन शेल है, जिस स्थिति में ठीक इसके विपरीत होता है।

तो यहाँ कुछ सुझाव दिए गए हैं:

  • यह निर्धारित करने के लिए $ SHLVL का उपयोग करें कि क्या आप बैश के "शीर्ष स्तर" आह्वान पर हैं, या संभवतः X लॉगिन सत्र के भीतर, या संभवतः X के भीतर एक शब्द / कमांड-प्रॉम्प्ट के भीतर (या शायद कंसोल!)। आप उपयोग कर सकते हैं tty कंसोल लॉगिन और टर्मिनल लॉगिन के बीच अंतर करने की कमान ( tty |grep -q ^/dev/tty && echo "is console" )
  • .bash_profile केवल एक बार पढ़ा जाएगा login session ... सामान्य रूप से। आप इसके साथ बैश लगाकर इसके पठन को भी बाध्य कर सकते हैं -l
  • यदि यह एक लॉगिन शेल है, .bashrc नहीं होगा स्वचालित रूप से पढ़ें। आप इसे भीतर से सोर्स करके चलाते हैं .bash_profile
  • मुझे विश्वास है कि आप सुनिश्चित करना चाहते हैं script फिर से प्रवेश नहीं है। यही है, अगर तुम एक खोल के साथ हो script चल रहा है, और आप एक उप-शेल बनाते हैं, आप नहीं चाहते हैं script फिर से दौड़ना
  • दौड़ने से क्या होता है screen अंदर script?
  • screen एक लॉगिंग सुविधा है जो स्क्रिप्ट की तुलना में अधिक उपयुक्त हो सकती है। फिर आपको अन्य समस्याएं हैं जैसे कि, क्या होता है जब आपके पास कई टर्मिनल विंडो खुली होती हैं? क्या उनमें से प्रत्येक का एक अलग स्क्रीन सत्र है?

1
मैं एक बेवकूफ हूँ ... जैसा कि आपने सुझाव दिया, इसे .bash_profile में डालने के बजाय .bashrc ने चाल चली। धन्यवाद!
mchen.ja

3

आपको परीक्षण करने के लिए अपना स्वयं का विशेष चर सेट करना होगा .bash_profile, जैसे,

if [ -z "$IN_MY_SCRIPT" ]
then
    export IN_MY_SCRIPT=$(date)
    script ~/Logs/$(date "+%Y-%m-%d.%H-%M-%S")
fi

0

मैं शीर्षक में "फोर्क बम को रोकना" प्रश्न का उत्तर दे रहा हूं, न कि वह जो आपने वास्तव में पूछा था। ;)

हार्ड रखो nproc में सीमा /etc/security/limits.conf पीएएम द्वारा लागू किया गया।

केवल एक सलाह:

 *        soft   nproc   500
 %users   soft   nofile  256

लेकिन यह सिर्फ Apache या MySQL जैसी किसी चीज के साथ खराब हो सकता है।

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