क्या यह जानने के लिए कि क्या यह अग्रभूमि या पृष्ठभूमि में चल रहा है, और क्या यह प्रत्येक मामले में थोड़ा अलग व्यवहार कर सकता है?
क्या यह जानने के लिए कि क्या यह अग्रभूमि या पृष्ठभूमि में चल रहा है, और क्या यह प्रत्येक मामले में थोड़ा अलग व्यवहार कर सकता है?
जवाबों:
उद्धरण man ps
:
Here are the different values that the s, stat and state output
specifiers (header "STAT" or "S") will display to describe the state of
a process.
...
+ is in the foreground process group
तो आप एक साधारण जाँच कर सकते हैं:
case $(ps -o stat= -p $$) in
*+*) echo "Running in foreground" ;;
*) echo "Running in background" ;;
esac
पिछले सभी समाधानों में स्पॉनिंग प्रक्रियाएं शामिल हैं, आदि .. बहुत, बहुत बदसूरत, चूंकि .bashrc
हर बार एक बैश शेल लॉन्च किया जाता है, इसलिए वे समाधान 1000 प्रक्रियाओं को लॉन्च करते हैं।
बहुत क्लीनर अपने आप को बैश पूछ रहा है: बैश में एक पूर्वनिर्धारित चर है $-
जो "i" है अगर इसकी एक इंटरैक्टिव शेल में चल रहा है। उदाहरण के लिए, इसे अपने .bashrc में डालना बहुत क्लीनर और बहुत सस्ता है और, सबसे महत्वपूर्ण बात, हमेशा काम करेगा!
case "$-" in
*i*) # interactive shell
;;
esac
हालांकि आप सोच सकते हैं कि अगर शेल को इंटरेक्टिव मोड में चलाया जाता है, तो वही परिणाम देगा, व्यवहार में, यह नहीं है। अवधारणा समान दिखती है लेकिन वास्तव में अलग है। आप उम्मीद के लिए पृष्ठभूमि खिला इनपुट में एक इंटरैक्टिव स्क्रिप्ट चला सकते हैं । इसके अलावा, आप अपने स्क्रिप्ट को -l
तर्क के साथ बैश के साथ लॉन्च कर सकते हैं । हम इस तरह से बैश अन्तरक्रियाशीलता पर भरोसा नहीं कर सकते हैं कि हमारी स्क्रिप्ट पृष्ठभूमि में या अग्रभूमि में चल रही है या नहीं।
इस प्रकार देवनाला का उत्तर सही है । यह निर्धारित करने के लिए कि प्रक्रिया अग्रभूमि में चल रही है या नहीं, पीएस यूटिलिटी यह जांचती है कि क्या प्रक्रिया समूह (pgrp) सत्र समूह के नियंत्रण टर्मिनल (tpgid) से जुड़ी प्रक्रिया समूह आईडी के समान है और प्रक्रिया के+
अनुसार आउटपुट में एक संकेत जोड़ता है राज्य।
यह जानते हुए कि, हम निश्चित रूप से परीक्षण का शुद्ध संस्करण हो सकते हैं:
#!/usr/bin/env bash
IFS=$' '
retval=($(</proc/$$/stat))
IFS=$' \t\n'
if [[ "${retval[3]}" == "${retval[7]}" ]]; then
echo "Background" > ./result.txt
else
echo "Foreground" > ./result.txt
fi
exit
ऊपर दिए गए कोड में, हम परिणाम को एक टेक्स्ट फाइल में आउटपुट कर रहे हैं क्योंकि stdout
बैकग्राउंड में एक प्रोसेस चलने पर कनेक्ट नहीं होता है।
कृपया तालिका के 4 वें और 8 वें तत्वों पर ध्यान दें pgrp
और देखेंtpgid
( / proc / [pid] / man पेज का स्टेट सेक्शन देखें ) - ।man 5 proc