कैसे निलंबित करें और अग्रभूमि के लिए एक पृष्ठभूमि प्रक्रिया लाएं


166

मेरे पास मूल रूप से अग्रभूमि में चलने वाली एक प्रक्रिया है। मैंने Ctrl+ से निलंबित कर दिया Z, और फिर पृष्ठभूमि में इसके चलने को फिर से शुरू किया bg <jobid>

मुझे आश्चर्य है कि पृष्ठभूमि में चल रही एक प्रक्रिया को कैसे निलंबित किया जाए?

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

संपादित करें:

प्रक्रिया stderr को आउटपुट करती है, इसलिए मैं fg <jobid>टर्मिनल को आउटपुट करते समय कमांड कैसे जारी कर सकता हूं ?


1
आप अभी भी एक टर्मिनल में कमांड टाइप कर सकते हैं जो त्रुटियों को उगल रहा है। STDERR पर लिखा गया पाठ इनपुट के रूप में नहीं गिना जाता है, केवल आपके द्वारा भेजे जाने वाले कुंजी। यह स्क्रीन पर भ्रामक लगता है लेकिन यह काम करता है।
कालेब

@ कालेब: यहां तक ​​कि जब प्रक्रिया स्टडआउट के लिए आउटपुट करती है, तब भी मैं fg <jobid>इसे अग्रभूमि बनाने के लिए टाइप कर सकता हूं ?
टिम

@ समय: हाँ, आप कर सकते हैं।
कालेब C

जवाबों:


214

जैसा कि टिम ने कहा, fgअंतिम प्रक्रिया को अग्रभूमि में लाने के लिए टाइप करें।

यदि आपके पास पृष्ठभूमि में चलने वाली एक से अधिक प्रक्रिया है, तो यह करें:

$ jobs
[1]   Stopped                 vim
[2]-  Stopped                 bash
[3]+  Stopped                 vim 23

fg %3vim 23प्रक्रिया को अग्रभूमि में लाने के लिए।

पृष्ठभूमि में चल रही प्रक्रिया को निलंबित करने के लिए, उपयोग करें:

kill -STOP %job_id

SIGSTOP सिग्नल अनिवार्य रूप से उसी तरह एक प्रक्रिया को रोक (रोक) देता है Ctrl+ Zकरता है।

उदाहरण: kill -STOP %3

स्रोत: लिनक्स और यूनिक्स में प्रक्रियाओं को सिग्नल कैसे भेजें और पृष्ठभूमि और अग्रभूमि नौकरियों का प्रबंधन कैसे करें


23
संकेत 19 SIGCONTमेरे लिए है; मैं वैसे भी संख्याओं को याद रखने के लिए उपयोग करता हूं kill -STOPऔर kill -CONTवरीयता देता हूं , लेकिन आप kill -lखुद को संख्यात्मक मूल्यों की याद दिलाने के लिए जांच कर सकते हैं
बेकार

प्रक्रिया stderr को आउटपुट देती है, इसलिए मैं कमांड कैसे जारी कर सकता हूं jobऔर fg <jobid>जबकि प्रक्रिया टर्मिनल पर आउटपुट कर रही है?
टिम

1
@ समय जैसा कि आप सामान्य रूप से करते हैं, वैसे ही कमांड टाइप करें। जब तक नौकरी की पृष्ठभूमि है, यह नहीं पढ़ रहा है कि आप क्या टाइप करते हैं - आपका शेल है। आप जो टाइप करते हैं वह आपको टूट सकता है, लेकिन शेल इसे ठीक समझेगा।
एलेक्स वेबब्रिज

@AlexWebr: धन्यवाद, यह काम करता है! (1) क्या कोई बैकग्राउंड नौकरी "Ctrl + Z" आदि सहित किसी भी इनपुट और आउटपुट को स्वीकार नहीं करता है, है ना? (२) क्या पृष्ठभूमि में चल रही नौकरी को सीधे निलंबित किया जा सकता है? यदि हाँ, तो कैसे? यदि नहीं, तो निलंबित होने से पहले इसे अग्रभूमि में चलाने के लिए पहले बदल दिया जाना चाहिए?
टिम

2
क्या पृष्ठभूमि में चलने वाली नौकरी को सीधे हां में निलंबित किया जा सकता है : kill -STOP %job_idजैसा कि समझाया गया है
बेकार

31

यह नौकरी के नियंत्रण के साथ किसी भी शेल का सच होना चाहिए, जो (अधिकांश भाग के लिए) आप तब तक के लिए ले जा सकते हैं जब तक कि वास्तव में प्राचीन शेल के साथ काम न करें। यह POSIX मानक में है , इसलिए यहां तक ​​कि dashनौकरी पर नियंत्रण का समर्थन करता है (जब अंतःक्रियात्मक रूप से या साथ चलाया जाता है -m)।

इंटरएक्टिव

  • Ctrl+ zवर्तमान में अग्रभूमि कार्यक्रम को निलंबित कर देगा
  • bgसबसे हाल ही में निलंबित कार्यक्रम की पृष्ठभूमि
    ( bg %2नौकरी नंबर के साथ उपयोग करें , जिसे आप देख सकते हैं jobs)
  • fg सबसे हाल ही में निलंबित कार्यक्रम को अग्रसर करेगा

में zsh, आप एक fgऔर Ctrl+ के माध्यम से शीघ्र से चलाने के लिए एक महत्वपूर्ण बंधन लिख सकते हैं z:

_zsh_cli_fg() { fg; }
zle -N _zsh_cli_fg
bindkey '^Z' _zsh_cli_fg

वहाँ भी शायद एक चतुर तरीका है bgपर शक करने के लिए चलाने के लिए , लेकिन यह नासमझ लगता है; कम से कम मेरे लिए, मेरी के बहुमत Ctrl+ zउपयोग वजह से है Ctrl+ cबाहर तोड़ विफल हो रहा है; मैं kill %1इसके बजाय उदाहरण के साथ पालन करना चाहता हूं bg, और मैं निश्चित रूप से हत्या करने के लिए डिफ़ॉल्ट नहीं करना चाहता हूं! (यह तर्क इस बात पर भी विस्तार करता है कि मैं अब इस कुंजी बंधन का उपयोग क्यों नहीं करता: यदि मैं एक प्रक्रिया को रोकने के लिए Ctrl+ पर हथौड़ा मार रहा हूं z, तो आखिरी चीज जो मैं करना चाहता हूं, वह फिर से शुरू है!)

गैर-इंटरैक्टिव

यदि आप एक अलग शेल इंस्टेंस (या कभी-कभी sudoकमांड सहित एक अलग उपयोगकर्ता ) में हैं, तो आप संभवतः जॉब नंबरों का उपयोग नहीं कर पाएंगे।

एक बार जब आप इसकी प्रक्रिया आईडी (पीआईडी) जान लेंगे तो आप दूसरी प्रक्रिया पर भी काम कर सकते हैं। आप पीआईडी ​​प्राप्त कर सकते हैं pgrep …, या ps aux |grep …(या उसी शेल से jobs -l, या $!) और आप फिर चला सकते हैं:

kill -STOP $PID  # suspend
kill -CONT $PID  # continue (resume)

यदि आप प्रक्रिया आईडी नहीं जानते हैं और नाम से प्रक्रिया के अन्य उदाहरणों को निलंबित करने के बारे में चिंतित नहीं हैं, तो आप इनमें से किसी एक को सिग्नल पास कर सकते हैं:

killall -STOP program_name
pkill -STOP program_name
pkill -f -STOP program_name_or_args

एक CONTकार्यक्रम के लिए एक संकेत Ctrl+ z(और नहीं bg'डी) के साथ बंद कर दिया अपनी प्रगति (अग्रभूमि में) फिर से शुरू करेंगे, जैसे कि आप इसके लिए थे fg

पुन: मानक त्रुटि

इस सवाल का संपादन मानक त्रुटि के बारे में पूछता है:

प्रक्रिया stderr को आउटपुट करती है, इसलिए मैं fg <jobid>टर्मिनल को आउटपुट करते समय कमांड कैसे जारी कर सकता हूं ?

जब तक प्रश्न में नौकरी में ऐसे घटक होते हैं जो पृष्ठभूमि में होते हैं (या पूरी नौकरी पृष्ठभूमि में होती है, शायद के माध्यम से kill -CONT), तो आपको निलंबित होने के दौरान वास्तव में आउटपुट नहीं देखना चाहिए।

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

यदि आपको नौकरी का विवरण खोजने की आवश्यकता है, तो STOPऊपर गैर-संवादात्मक तरीकों के माध्यम से संकेत भेजने के लिए दूसरे टर्मिनल का उपयोग करें । यह ऊपर अपने प्रदर्शन मुक्त कर देना चाहिए (शायद मारा Enterकई बार या चलाने clearया Ctrl+ L) ताकि आप तो चला सकते हैं jobsकाम वर्णनकर्ता को खोजने के लिए और फिर से चलाने fg %Nजहां Nकि संख्या है।


प्रक्रिया को रोकने और फिर से शुरू करने के साथ एकमात्र समस्या यह है कि यदि आपने किसी अन्य प्रोग्राम (जैसे उदाहरण के लिए RabbitMQ) से कोई संबंध बनाया है, तो आपके द्वारा फिर से शुरू करने पर कनेक्शन खो जाएगा।
नव

@Nav - ऐसा इसलिए है क्योंकि आपने इसे बिना सिर के नहीं चलाया है। बैश और zsh में, मैं आप केवल करने की जरूरत का मानना है कि त्याग देते एक backgrounded प्रक्रिया। मैं ऐसे कार्यों को nohup या स्क्रीन या tmux जैसे टर्मिनल मल्टीप्लेकर के साथ चलाना पसंद करता हूँ । आप एक नोहप प्रक्रिया नहीं उठा सकते हैं (जिस तरह आप एक अलग कनेक्शन से पृष्ठभूमि वाली प्रक्रिया को फिर से शुरू नहीं कर सकते हैं), लेकिन आप एक मल्टीप्लेक्सर से कनेक्ट कर सकते हैं।
एडम काटज़

यह एक पृष्ठभूमि प्रक्रिया थी। मैंने टर्मिनल बंद कर दिया था और फिर दूसरे टर्मिनल से सर्वर में लॉग इन किया।
नव

हाँ, आप किसी अन्य शेल से प्रक्रिया को फिर से शुरू नहीं कर सकते हैं जब तक कि इसे ध्यान में रखकर लॉन्च नहीं किया गया हो। मैं उसके लिए स्क्रीन या tmux की सलाह देता हूं।
एडम काट्ज

मेरा मानना ​​है कि यदि आप CONTCtrl + Z के साथ बंद की गई प्रक्रिया (नौकरी / पाइपलाइन) को संकेत भेजते हैं , तो यह पृष्ठभूमि में फिर से शुरू हो जाएगा, भले ही आपने इसे नहीं किया bgहो।
जी-मैन

10

fgइसे अग्रभूमि में लाने के लिए टाइप करें।


धन्यवाद! प्रक्रिया stderr को आउटपुट करती है, इसलिए मैं fg <jobid>टर्मिनल को आउटपुट करते समय कमांड कैसे जारी कर सकता हूं ?
टिम

1
  1. jobsआदेश के साथ नौकरी की सूची
  2. अपनी लक्षित नौकरी को अग्रभूमि में लाएँ fg; उदाहरण के लिए: fg %4
  3. CTRL Zसस्पेंड करने के लिए मारा
  4. इसे पृष्ठभूमि में चालू करने के लिए, bg का उपयोग करें; उदाहरण के लिए:bg %4

0

एक प्रक्रिया को समाप्त करना कई अलग-अलग तरीकों से किया जा सकता है। अक्सर, कंसोल-आधारित कमांड से, Ctrlcकीस्ट्रोके (डिफ़ॉल्ट इंटरप्ट कैरेक्टर) भेजने से कमांड बाहर निकल जाएगी। यह काम करता है जब प्रक्रिया अग्रभूमि मोड में चल रही है।

यदि कोई प्रक्रिया पृष्ठभूमि मोड में चल रही है, तो पहले आपको psकमांड का उपयोग करके इसकी जॉब आईडी प्राप्त करनी होगी और उसके बाद आप इस प्रक्रिया को मारने के लिए किल कमांड का उपयोग कर सकते हैं:

$ps -f
UID      PID  PPID C STIME    TTY   TIME CMD
amrood   6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood   6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood   3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood   6892 3662 4 10:51:50 pts/6 0:00 ps -f
$kill 6738
Terminated

यहाँ killकमांड first_oneप्रक्रिया को समाप्त कर देती है। यदि कोई प्रक्रिया एक नियमित killकमांड को अनदेखा करती है , तो आप kill -9प्रक्रिया आईडी द्वारा निम्नानुसार उपयोग कर सकते हैं :

$kill -9 6738
Terminated

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