अगर यह पृष्ठभूमि में चल रहा है तो एक बैश स्क्रिप्ट का पता कैसे लगाया जा सकता है?


28

क्या यह जानने के लिए कि क्या यह अग्रभूमि या पृष्ठभूमि में चल रहा है, और क्या यह प्रत्येक मामले में थोड़ा अलग व्यवहार कर सकता है?


ध्यान दें कि एक प्रक्रिया अग्रभूमि से पृष्ठभूमि तक जा सकती है और इसके विपरीत नौकरी पर नियंत्रण के कारण।
बरमार

1
आपको यह जानने में भी दिलचस्पी हो सकती है कि स्क्रिप्ट एक इंटरैक्टिव शेल से चल रही है
GnP

जवाबों:


30

उद्धरण 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

निश्चित रूप से $ (...) के भीतर कुछ भी आह्वान किया गया है? मुझे लगता है कि प्रक्रिया समूह महत्वपूर्ण बात है, हालांकि, इससे इनकार नहीं किया जा सकता है कि यह काम करता है।
एड रान्डेल

2

फ़ाइल को देखें /etc/bash.bashrc "।

वह पंक्ति जिसमें "$ PS1" है। फिर "मैन बैश" करें और टोकन PS1 देखें।

[ -z "$PS1" ] && return

एक स्क्रिप्ट से बाहर निकलता है जो इंटरैक्टिव नहीं है।


1

पिछले सभी समाधानों में स्पॉनिंग प्रक्रियाएं शामिल हैं, आदि .. बहुत, बहुत बदसूरत, चूंकि .bashrcहर बार एक बैश शेल लॉन्च किया जाता है, इसलिए वे समाधान 1000 प्रक्रियाओं को लॉन्च करते हैं।

बहुत क्लीनर अपने आप को बैश पूछ रहा है: बैश में एक पूर्वनिर्धारित चर है $-जो "i" है अगर इसकी एक इंटरैक्टिव शेल में चल रहा है। उदाहरण के लिए, इसे अपने .bashrc में डालना बहुत क्लीनर और बहुत सस्ता है और, सबसे महत्वपूर्ण बात, हमेशा काम करेगा!

case "$-" in 

    *i*) # interactive shell

    ;;
esac

तुम क्यों चिल्ला रहे हैं? यह बहुत, बहुत बदसूरत लग रहा है ...
पियरे.वीयरेंस

सरल, सही समाधान।
एड रान्डेल

0

हालांकि आप सोच सकते हैं कि अगर शेल को इंटरेक्टिव मोड में चलाया जाता है, तो वही परिणाम देगा, व्यवहार में, यह नहीं है। अवधारणा समान दिखती है लेकिन वास्तव में अलग है। आप उम्मीद के लिए पृष्ठभूमि खिला इनपुट में एक इंटरैक्टिव स्क्रिप्ट चला सकते हैं । इसके अलावा, आप अपने स्क्रिप्ट को -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

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