2013-02-28 8 views
5

मेरे पास कुछ फ़ाइलों में रिकॉर्ड को संसाधित करने के लिए एक स्क्रिप्ट है, इसमें आमतौर पर 1-2 घंटे लगते हैं। जब यह चल रहा है, तो यह संसाधित रिकॉर्ड्स की संख्या की प्रगति को प्रिंट करता है।मुझे कैसे पता चलेगा कि कोई बैश स्क्रिप्ट नोहप के साथ चल रही है या नहीं?

अब, मैं क्या करना चाहता हूं: जब यह nohup के साथ चल रहा है, तो मैं प्रगति मुद्रित नहीं करना चाहता; इसे केवल मैन्युअल रूप से चलाने पर प्रगति मुद्रित करनी चाहिए।

मेरा प्रश्न यह है कि मुझे कैसे पता चलेगा कि nohup के साथ एक बैश स्क्रिप्ट चल रही है या नहीं?

मान लीजिए कि आदेश nohup myscript.sh & है। स्क्रिप्ट में, मैं कमांड लाइन से nohup कैसे प्राप्त करूं? मैंने $0 का उपयोग करने की कोशिश की, लेकिन यह myscript.sh देता है।

उत्तर

2

अगर STDOUT एक टर्मिनल साथ जुड़ा हुआ है आप जांच कर सकता है:

[ -t 1 ] 
+0

कृपया डाउनवोट को गठबंधन करें। धन्यवाद – lukuluku

+1

ध्यान दें कि यह टर्मिनल की जांच करता है, भले ही यह नोहप के तहत चल रहा हो। यदि आप 'myscript.sh> out.txt' चलाते हैं तो यह चेक भी असफल हो जाएगी। (मैंने आपको डाउनवोट नहीं किया) – johndodo

1

एक ही रास्ता है, लेकिन वास्तव में पोर्टेबल नहीं /proc/$$/fd/1 और परीक्षण पर एक readlink करने के लिए हो सकता है अगर यह nohup.out साथ समाप्त होता है।

[ -t 1 ] 
+0

यदि आप myscript.sh> out.txt चलाते हैं तो यह चेक विफल हो जाएगी। – ndemou

0

तुम लोग धन्यवाद:

लेकिन इस तरह की समस्याओं के लिए परंपरागत दृष्टिकोण अगर उत्पादन एक टर्मिनल है परीक्षण करने के लिए है। STDOUT जांचें एक अच्छा विचार है। मुझे बस ऐसा करने का एक और तरीका मिल गया। टीटीई का परीक्षण करना है। परीक्षण tty -s अपने रिटर्न कोड की जांच करें। यदि यह 0 है, तो यह टर्मिनल पर चल रहा है; अगर यह 1 है तो यह नोहप के साथ चल रहा है।

+1

वास्तव में, आप एक ही चीज कर रहे हैं tt -s जांचता है अगर stdout टर्मिनल है (देखें: http://ss64.com/bash/tty.html) और -t 1 समान है (देखें: http: // www.gnu.org/software/bash/manual/bashref.html#Bash-Conditional-Expressions) – Sorin

3

फ़ाइल पुनर्निर्देशन की जांच करना मजबूत नहीं है, क्योंकि nohup स्क्रिप्ट में उपयोग किया जा सकता है (और अक्सर होता है) जहां stdin, stdout और/या stderr पहले ही स्पष्ट रूप से पुनर्निर्देशित होते हैं।

इन पुनर्निर्देशन से

अलावा, केवल एक चीज nohup करता ignore the SIGHUP signal (लिंक के लिए this guy के लिए धन्यवाद।) है

तो, वास्तव में अगर SIGHUP पर ध्यान नहीं दिया जा रहा है पता लगाने के लिए एक तरह से है कि हम क्या के लिए पूछ रहे हैं। लिनक्स में, सिग्नल अनदेखा मुखौटा /proc/$PID/status, in the least-significant bit of the SigIgn hex string में उजागर किया गया है।

बशर्ते हम उस बैश स्क्रिप्ट के पिड को जानते हैं जिसे हम देखना चाहते हैं, हम egrep का उपयोग कर सकते हैं। यहाँ मैं देख रहा हूँ अगर वर्तमान खोल SIGHUP अनदेखी कर रहा है (यानी "nohuppy" है):

$ egrep -q "SigIgn:\s.{15}[13579bdf]" /proc/$$/status && echo nohuppy || echo normal 
normal 
$ nohup bash -c 'egrep -q "SigIgn:\s.{15}[13579bdf]" /proc/$$/status && echo nohuppy || echo normal'; cat nohup.out 
nohup: ignoring input and appending output to `nohup.out' 
nohuppy 
0

आप देख सकते हैं या तो करता है, तो माता-पिता पीआईडी ​​1:

if [ $PPID -eq 1 ] ; then 
    echo "Parent pid=1 (runing via nohup)" 
else 
    echo "Parent pid<>1 (NOT running via nohup)"            
fi 

या आपकी स्क्रिप्ट SIGHUP पर ध्यान नहीं देता सिग्नल (देखें https://stackoverflow.com/a/35638712/1011025):

if egrep -q "SigIgn:\s.{15}[13579bdf]" /proc/$$/status ; then 
    echo "Ignores SIGHUP (runing via nohup)" 
else 
    echo "Doesn't ignore SIGHUP (NOT running via nohup)"            
fi 
संबंधित मुद्दे