बैश `सस्पेंड` बिलियन कमांड का उद्देश्य क्या है?


22

मैंने टाइप किया help suspendऔर यह संक्षिप्त विवरण मिला:

suspend: suspend [-f]
    Suspend shell execution.

    Suspend the execution of this shell until it receives a SIGCONT signal.
    Unless forced, login shells cannot be suspended.

    Options:
      -f    force the suspend, even if the shell is a login shell

    Exit Status:
    Returns success unless job control is not enabled or an error occurs.

मैं यह कैसे समझ सकता हूं: मैं टाइप करता हूं suspendऔर टर्मिनल फ्रीज हो जाता है, स्ट्रॉग + सी भी इसे अप्रभावित नहीं कर सकता है। लेकिन जब मैं एक और टर्मिनल खोलता हूं और जमे हुए एक के लिए पीआईडी ​​की खोज kill -SIGCONT PID-NRकरता हूं और एक एसआईजीकॉन्ट सिग्नल टाइप करता हूं, तो जमे हुए टर्मिनल को भेज दिया जाता है और इसे ऊपर ले जाता है, जिससे यह अनफ्रोजेन हो जाता है।

लेकिन, एक टर्मिनल को निलंबित करने का वास्तविक उद्देश्य क्या है? हर दिन कौन से अनुप्रयोग इसके लिए विशिष्ट हैं? जिन लोगों ने इसे शेल बनाया है, उनके दिमाग में क्या था?


2
सस्पेंड के लिए बाहरी प्रोग्राम (मार) चलाने से बचें।
इपोर सिरसीर

जवाबों:


23

यदि आप दूसरे शेल से शेल शुरू करते हैं, तो आप आंतरिक को निलंबित कर सकते हैं। उपयोग करते समय कहें su, और एक पल के लिए नियमित उपयोगकर्ता पर वापस जाना चाहते हैं:

user$ su
Password: ...
root# do something
root# suspend
user$ do something as the ordinary user again
user$ fg
root# ...

(यदि आप ऐसा करते हैं, तो पृष्ठभूमि में खुला खोल को न भूलें ...)

इसी तरह, यदि आप किसी अन्य प्रोग्राम ( !उदाहरण के लिए कमांड less) से शेल पर जाते हैं, तो भी आप शेल को निलंबित कर सकते हैं। लेकिन मैं कई अन्य कार्यक्रमों की उम्मीद नहीं करूँगा जब वे एक उपप्रकार को लॉन्च करते हैं, जो तब खुद को निलंबित कर देते हैं।


1
मैंने बस चलाने की कोशिश की vim, और :shएक उप-प्राप्त करने के लिए किया (विशेष रूप से, एक zshउप-संस्करण)। रनिंग suspendने मुझे मूल शेल में पॉप कर दिया (इसने सब-सब्मिट और विम दोनों को सस्पेंड कर दिया)।
केविन

1
@ केविन, zshउस से अधिक स्मार्ट लगता है bash, मैंने दोनों से भागने की कोशिश की lessऔर vi(डेबियन के vim.tiny): zshमाता-पिता ऐप को भी बंद कर bashदिया, पूरी बात लटका दी। bashकरने के लिए bashकाम करता है, हालांकि।
इलकाचू

1
मुझे पता नहीं था, कि मैं किस प्रकार sudo su का सब-आरंभ कर रहा हूँ। जब मैंने टाइप किया मुख्य शेल में सस्पेंड हो जाता है तो शेल आसानी से जमा देता है, लेकिन आपने कैसे दिखाया, जब मैं इसे सबस्क्रिप्शन के अंदर सुपरसेंड करता हूं तो मैं स्वचालित रूप से मुख्य शेल पर वापस जाता हूं।
शार्क

25

यह Ctrl+Zअन्य कमांड में दबाने के बराबर है ।

यह शेल को निलंबित कर देता है और यदि कोई हो तो पैरेंट शेल या प्रक्रिया पर नियंत्रण वापस देता है।

उदाहरण:

zsh$ bash
bash-4.4$ cd /
bash-4.4$ suspend
zsh: suspended (signal)  bash
zsh$ fg
[1]  + continued  bash
bash-4.4$ pwd
/

यह सुविधा 80 के दशक की शुरुआत में बीएसडी के शेल (जहां जॉब कंट्रोल से आती है) से आती है ।

एटी एंड टी में ksh, यह kill -s STOP $$( उद्धरण के बिना हाँ के लिए एक बिलियन उर्फ ​​है ! )

आपके मामले में, bashशायद टर्मिनल एमुलेटर द्वारा सीधे शुरू किया गया था। और आपके टर्मिनल एमुलेटर को प्रक्रिया के निलंबित होने की उम्मीद नहीं थी।

वह bashएक सत्र का नेता था। यदि सत्र नेता को निलंबित कर दिया जाता है, यदि हम पुराने समय के टर्मिनलों का विचार करते हैं, तो उपयोगकर्ता के पास इसे फिर से शुरू करने का कोई रास्ता नहीं होगा।

bashपता है कि suspendअगर यह एक लॉगिन खोल है इनकार कर दिया । लेकिन आपके मामले में, आपका टर्मिनल एमुलेटर संभवत: bashलॉगिन मोड में शुरू नहीं होता है, ताकि सुरक्षा की व्यवस्था न हो।

zshऔर mkshसमस्या नहीं है क्योंकि वे भेजने के लिए SIGTSTP(एक भी भेजा Ctrl+Z) csh की तरह संकेत SIGSTOP(और के लिए कॉल करने वाले की प्रक्रिया समूह के लिए mkshcsh में पसंद है, और के लिए मुख्य प्रक्रिया समूह के zshलिए $$प्रक्रिया, अकेले नहीं प्रक्रिया )। SIGTSTPजब एक अनाथ प्रक्रिया समूह को वितरित किया जाता है, और नेता के समूह को नजरअंदाज कर दिया जाता है। यह विचार यह है कि SIGTSTP को उपयोगकर्ता द्वारा फिर से शुरू नहीं होने वाली किसी चीज को निलंबित नहीं करना चाहिए।

में mkshया yash, एक भी उपयोग कर सकते हैं suspendकरने के लिए एक ही निलंबित subshell:

$ (set -x; sleep 1; suspend; sleep 2)
+ sleep 1
+ suspend
[1] + Stopped(SIGSTOP)     (set -x; sleep 1; suspend; sleep 2)
$ fg
[1] (set -x; sleep 1; suspend; sleep 2)
+ sleep 2

इससे काम नहीं zshचलेगा कि कॉलर के बजाय मुख्य प्रक्रिया समूह को SIGTSTP भेजता है। किसी भी शेल में जो killबिल्डिन में होता है, कोई भी इसके kill -s TSTP 0बजाय हमेशा उपयोग कर सकता है।


4
आप निलंबन के लिए एक सामान्य उपयोग का हवाला दे सकते हैं: bash (और शायद बहुत सारे गोले) में: जब आपने एक लंबी कमांड शुरू की थी, और आप इसे बाधित नहीं करना चाहते हैं, लेकिन जिसे आपने पृष्ठभूमि में (यानी, आप चाहते हैं, command .... &लेकिन किया था) भूल गए &और अब इच्छा है कि आप इसे कमांड को बाधित किए बिना जोड़ सकते हैं): आप कर सकते हैं: ctrl-zऔर फिर टाइप करें: bgपृष्ठभूमि में नवीनतम निलंबित कार्य को फिर से शुरू करने के लिए। (या bg %nकार्य संख्या के साथ ऐसा करने के लिए njobsनिलंबित या चल रहे कार्यों की सूची प्राप्त करने के लिए उपयोग करें )
ओलिवियर दुलैक

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