fg` कमांड का सुपर टिप: जब Ctrl+Z आपके टर्मिनल सेशन को बचाता है
प्रकाशित: 18 April 2026
- समस्या : एक व्यस्त टर्मिनल
- तीन अनिवार्य आदेश
- परिदृश्य 1 : लंबा बिल्ड
- स्केनेरियो 2: भुला हुआ संपादक
- परिदृश्य 3: opencode प्रक्रिया निलंबित
- परिदृश्य 4: कई जॉब्स को एक साथ प्रबंधित करें
- fg, bg, Ctrl+Z, Ctrl+C और & के अंतर
- Bake (generate) the site jbake -b
- Bake and watch for changes jbake -b --reset
- Specify source and destination jbake source_folder output_folder
- Clear the output directory before baking jbake -b . output --resetगैर-विध्वंसक# JBake CLI Commands
`# Initialize a new JBake project jbake -i - Bake (generate) the site jbake -b
- Bake and serve locally jbake -b -s
- Bake and watch for changes jbake -b --reset
- Specify source and destination jbake source_folder output_folder
- Clear the output directory before baking jbake -b . output --reset
` - Bake (generate) the site jbake -b
आप फेंकते हैं`./gradlew build`, टर्मिनल 3 मिनट के लिए ब्लॉक किया गया है, और आपको कुछ और करने की आवश्यकता है en attendant ? नए टैब खोलने की आवश्यकता नहीं है.`Ctrl+Z`प्रक्रिया को सस्पेंड करें`fg`इसे बिल्कुल वहीं लाया जाता है जहाँ आपने उसे छोड़ा था। यह डेवलपर के दैनिक जीवन का सबसे कम आंका जाने वाला यूनिक्स टिप है।
समस्या : एक व्यस्त टर्मिनल
हर डेवलपर ने इस स्थिति को अनुभव किया है:
$ ./gradlew build
> Building...
और आपको एक फ़ाइल देखनी है, एक लॉन्च करना है`git status`, या एक व्यस्त पोर्ट की जांच करें।
@startuml skinparam backgroundColor #FEFEFE actor Développeur as dev participant "टर्मिनल" as term participant "Gradle\n( प्रक्रिया )" as gradle dev -> term : ./gradlew build term -> gradle : Lance le build gradle -> term : Occupe le terminal\n(pas de prompt) dev -> term : veut taper une commande term --> dev : ❌ Terminal bloqué note right of dev डेवलपर बिल्ड की पूरी अवधि के दौरान लाचार रहता है end note @enduml
अधिकांश डेवलपर्स एक नया टर्मिनल खोलते हैं। लेकिन एक अधिक सुंदर, तेज़ और मूल समाधान मौजूद है: जॉब प्रबंधन।
तीन अनिवार्य आदेश
Ctrl+Z — रोकें (SIGTSTP)
`Ctrl+Z`सिग्नल भेजो`SIGTSTP`अग्रभूमि प्रक्रिया में. प्रक्रिया हैनिलंबित— नहीं मारा गया — और टर्मिनल अपना प्रॉम्प्ट फिर से प्राप्त करता है।
$ ./gradlew build
> Building...
^Z
[1]+ Stoppé ./gradlew build
$
कोष्ठकों के बीच की संख्या`[1]` est le जॉब नंबर. Le `+`डिफ़ॉल्ट जॉब को दर्शाता है।
fg — अग्रभूमि में लाएँ
`fg`यह निलंबित कार्य को अग्रभूमि में लाता है। प्रक्रिया ठीक उसी स्थान से फिर से शुरू हो जाती है जहाँ वह रुकी थी।
$ fg
./gradlew build
> Building... (reprend où il en était)
एक विशिष्ट जॉब नंबर के साथ:
$ fg %2
bg — पृष्ठभूमि में जारी रखना
`bg`प्रक्रिया को टर्मिनल ब्लॉक किए बिना फिर से शुरू करता है। लंबे बील्ड्स के लिए आदर्श।
$ bg
[1]+ ./gradlew build &
$
Le `&`अंत में इसका मतलब है कि प्रक्रिया बैकग्राउंड में चल रही है.
jobs — शेल के कार्यों को सूचीबद्ध करना
$ jobs
[1]- Stoppé vim README.md
[2]+ En cours ./gradlew build
@startuml skinparam backgroundColor #FEFEFE skinparam defaultFontName sans-serif state "अग्रभूमि\n(टर्मिनल ब्लॉक है)" as fg #LightCoral state "निलंबित\n(Ctrl+Z)" as stopped #LightYellow state "पृष्ठभूमि\n(bg)" as bg_ #LightGreen [*] --> fg : Lance une commande fg --> stopped : Ctrl+Z\n(SIGTSTP) stopped --> fg : fg\nreprend en avant-plan stopped --> bg_ : bg\nreprend en arrière-plan bg_ --> fg : fg\nramène en avant-plan fg --> [*] : Commande terminée note right of stopped प्रक्रिया स्थिर है लेकिन मारी _नहीं_ गई है end note note left of bg_ टर्मिनल खाली है बिल्ड जारी है end note @enduml
परिदृश्य 1 : लंबा बिल्ड
यह सबसे सामान्य उपयोग का मामला है। आप एक Gradle बिल्ड शुरू करते हैं, टर्मिनल ब्लॉक हो जाता है, और आपको कुछ अन्य करने की आवश्यकता होती है।
@startuml skinparam backgroundColor #FEFEFE autonumber actor Développeur as dev participant "टर्मिनल" as term participant "Gradle" as gradle database "प्रक्रिया\nस्थिति" as state dev -> term : ./gradlew build term -> gradle : Lance le build gradle -> state : En cours (FG) dev -> term : Ctrl+Z term -> state : Suspendu (job [1]) term --> dev : Prompt libre $ dev -> term : git status term --> dev : working tree clean dev -> term : fg term -> state : Reprend (FG) gradle --> dev : Build réussi ✓ note right of state Gradle प्रोसेस कभी समाप्त नहीं हुई यह ठीक वहीं से फिर से शुरू होती है जहाँ यह रुकी थी end note @enduml
चरण-दर-चरण
$ ./gradlew build
> Building...
^Z
[1]+ Stoppé ./gradlew build
$ git status
On branch main
nothing to commit, working tree clean
$ fg
./gradlew build
> Building...
BUILD SUCCESSFUL in 2m 34s
स्केनेरियो 2: भुला हुआ संपादक
आप में हैं`vim`, आपको किसी अन्य फ़ाइल को देखना है बिना बाहर निकले`vim`.
# Dans vim, en mode commande :
:shell
$ cat /path/to/other/file.txt
$ exit
# Retour dans vim
लेकिन यह भारी है। के साथ`Ctrl+Z`, यह तुरंत है :
# Dans vim, n'importe quel moment :
Ctrl+Z
[1]+ Stoppé vim README.md
$ cat /path/to/other/file.txt
# ... lire le fichier ...
$ fg
vim README.md
# Retour exact là où on en était, curseur en place
@startuml skinparam backgroundColor #FEFEFE autonumber actor Développeur as dev participant "vim" as vim participant "शेल" as shell dev -> vim : édition en cours dev -> vim : Ctrl+Z vim -> shell : Suspendu (job [1]) dev -> shell : cat autre_fichier.txt shell --> dev : contenu du fichier dev -> shell : fg shell -> vim : Reprend (job [1]) vim --> dev : Curseur exactement\nà la même position note right of vim vim पूरी तरह से स्थिति को पुनर्स्थापित करता है: कर्सर की स्थिति, बफर, undo stack end note @enduml
</think> vim`यह अपनी स्थिति को पूरी तरह से बहाल करता है एक`fg: कर्सर की स्थिति, बफ़र की सामग्री, अनडू इतिहास — सब कुछ संरक्षित है.
परिदृश्य 3: opencode प्रक्रिया निलंबित
यह वह परिदृश्य है जिसने इस लेख को प्रेरित किया। आप उपयोग कर रहे हैं`opencode`(CLI टूल आपके कोड पर एक LLM को नियंत्रित करने के लिए), और प्रक्रिया निलंबित है।
@startuml skinparam backgroundColor #FEFEFE skinparam defaultFontName sans-serif skinparam componentStyle rectangle actor Développeur as dev participant "opencode\n(LLM एजेंट)" as agent participant "शेल (Shell)" as shell participant "git" as git dev -> agent : Session active agent -> agent : Tour de parole\ndu LLM en cours note over agent Ctrl+Z एक कोड विश्लेषण के ठीक बीच में आता है end note dev -> agent : Ctrl+Z agent -> shell : Suspendu (job [1]) dev -> git : git diff git --> dev : changements visibles dev -> shell : fg shell -> agent : Reprend (job [1]) agent --> dev : Reprend exactement\nl'analyse en cours note right of agent कोई संदर्भ हानि नहीं LLM अपना उत्तर ठीक वहीं से शुरू करता है जहाँ वह था end note @enduml
$ opencode
# ... session en cours, LLM analyse le code ...
^Z
[1]+ Stoppé opencode
$ git diff HEAD~1
# vérifier les changements récents
$ fg
opencode
# Le LLM reprend là où il s'était arrêté
फ़ायदा दोगुना है :
-
कोई संदर्भ हानि नहींLLM सत्र, वार्तालाप का इतिहास, खुले फ़ाइलें — सब कुछ संरक्षित है
-
रीबूट नहीं: opencode को पुनः प्रारंभ करने की आवश्यकता नहीं है, संदर्भ को पुनः लोड करने की आवश्यकता नहीं है, LLM को समस्या की पुनः व्याख्या करने की आवश्यकता नहीं है
परिदृश्य 4: कई जॉब्स को एक साथ प्रबंधित करें
fg et `bg`वे एक जॉब नंबर स्वीकार करते हैं एक विशेष प्रक्रिया को लक्ष्य करने के लिए जब कई निलंबित हैं।
$ vim config.yml
^Z
[1]+ Stoppé vim config.yml
$ ./gradlew test
^Z
[2]+ Stoppé ./gradlew test
$ htop
^Z
[3]+ Stoppé htop
$ jobs
[1] Stoppé vim config.yml
[2]- Stoppé ./gradlew test
[3]+ Stoppé htop
$ fg %2
./gradlew test
# Le build reprend en avant-plan
$ bg %3
[3] htop &
# htop reprend en arrière-plan
@startuml
skinparam backgroundColor #FEFEFE
rectangle "निलंबित जॉब्स" as jobs #LightYellow {
card "[1] vim config.yml" as j1
card "[2] ./gradlew test" as j2
card "[3] htop" as j3
}
rectangle "कार्रवाईयाँ" as actions #LightGreen {
card "fg %2\n→ फोरग्राउंड" as a1
card "bg %3\n→ बैकग्राउंड" as a2
card "fg %1\n→ फोरग्राउंड" as a3
}
jobs --> actions : fg/bg + numéro de job
actions --> j2 : Reprend
actions --> j3 : En arrière-plan
note bottom of jobs
प्रत्येक जॉब
अपनी सटीक स्थिति
suspend/resume के बीच बनाए रखता है
end note
@enduml
कार्यों के आदेशों का सारांश
| आदेश | प्रभाव | उदाहरण |
|---|---|---|
|
प्रक्रिया को अग्रभूमि में निलंबित करें |
भेजने का`SIGTSTP` |
|
डिफ़ॉल्ट जॉब को फ़ोरग्राउंड में फिर से शुरू करें |
|
|
जॉब अग्रभूमि में फिर से शुरू करता है |
|
|
डिफ़ॉल्ट जॉब को पृष्ठभूमि में फिर से शुरू करें |
|
|
न के जॉब को पृष्ठभूमि में फिर से शुरू करें |
|
|
वर्तमान शेल के कार्यों की सूची बनाएँ |
|
|
job completo करो n |
|
fg, bg, Ctrl+Z, Ctrl+C और & के अंतर
बहुत से डेवलपर्स इन तंत्रों को भ्रमित करते हैं। यहाँ एक निर्णायक स्पष्टीकरण दिया गया है।
@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultFontName sans-serif
rectangle "**Ctrl+Z**\nSIGTSTP" as ctrlz #LightYellow {
card "प्रक्रिया को निलंबित करता है\n(यह अभी भी मेमोरी में रहती है)\nfg/bg के साथ उपयोग किया जा सकता है" as c1
}
rectangle "**Ctrl+C**\nSIGINT" as ctrlc #LightCoral {
card "प्रक्रिया को समाप्त करता है\n(वापसी संभव नहीं है)\nपूरी स्थिति का नुकसान" as c2
}
rectangle "**& **\n(बैकग्राउंड)" as ampersand #LightGreen {
card "सीधे बैकग्राउंड में\nशुरू करता है\nटर्मिनल तुरंत खाली हो जाता है" as c3
}
rectangle "**fg**\n(foreground)" as fg_ #SkyBlue {
card "एक निलंबित जॉब को\nफोरग्राउंड में वापस लाता है\nटर्मिनल व्यस्त रहता है" as c4
}
rectangle "**bg**\n(background)" as bg_ #Lavender {
card "एक निलंबित जॉब को\nबैकग्राउंड में फिर से शुरू करता है\nटर्मिनल खाली रहता है" as c5
}
ctrlz -right-> fg_ : fg pour reprendre
ctrlz -right-> bg_ : bg pour continuer\nen arrière-plan
ctrlc -right-> c2 : Pas de retour\nprocessus tué
note bottom of ctrlz
प्रक्रिया **जम (frozen)** गई है
लेकिन **खत्म (killed)** नहीं हुई है
end note
note bottom of ampersand
विकल्प: लॉन्च करें
`./gradlew build &`
सीधे बैकग्राउंड में
end note
@enduml
| शॉर्टकट/कमांड | सिग्नल | प्रभाव | वापस लौटना? |
|---|---|---|---|
|
|
प्रक्रिया को निलंबित करें (जमा, मेमोरी में) |
हाँ :`fg` ou |
|
|
प्रक्रिया को मारें (समाप्त) |
नहीं: नष्ट प्रक्रिया |
|
|
प्रक्रिया मारो + core dump |
नहीं : नष्ट प्रक्रिया |
|
बैकग्राउंड में सीधे लॉन्च करें |
`fg`इसे सामने लाने के लिए |
Ctrl+Z`JBake संदर्भ (यह सामग्री JBake टेम्प्लेट और कन्वेंशन का उपयोग करती है): # JBake CLI कमांड `` # Initialize a new JBake project jbake -i
|
Bake (generate) the site jbake -b
@startuml skinparam backgroundColor #FEFEFE skinparam defaultFontName sans-serif title एक शेल जॉब का संपूर्ण जीवन चक्र state "अस्तित्वहीन" as none state "फोरग्राउंड\n(टर्मिनल घेरता है)" as foreground #LightCoral state "निलंबित\n(Ctrl+Z / SIGTSTP)" as suspended #LightYellow state "बैकग्राउंड\n(bg या &)" as background #LightGreen state "पूर्ण\n(exit code 0)" as done #LightGray [*] --> none none --> foreground : tape une commande foreground --> suspended : Ctrl+Z foreground --> done : fin normale suspended --> foreground : fg suspended --> background : bg suspended --> done : kill %n background --> foreground : fg background --> done : fin normale\n(en arrière-plan) background --> suspended : Ctrl+Z\n(si fg puis Ctrl+Z) done --> [*] note right of suspended निलंबित अवस्था (suspended state) जॉब्स के पूरे सिस्टम का केंद्र बिंदु है end note @enduml
Bake and watch for changes jbake -b --reset
Specify source and destination jbake source_folder output_folder
Clear the output directory before baking jbake -b . output --resetगैर-विध्वंसक# JBake CLI Commands ` # Initialize a new JBake project jbake -i
Bake (generate) the site jbake -b
Bake and serve locally jbake -b -s
Bake and watch for changes jbake -b --reset
Specify source and destination jbake source_folder output_folder
Clear the output directory before baking jbake -b . output --reset `
fr से hi में अनुवाद करें सभी बैकटिक कोड स्पैन (…) को बिल्कुल वैसा ही रखें — बैकटिक की सामग्री, स्पेसिंग, या स्थिति कभी न बदलें। यह पाठ बड़े वाक्य का एक अंश हो सकता है — अंश का अनुवाद अधिक संदर्भ मांगे बिना करें। केवल अनुवादित पाठ आउटपुट करें — कोई स्पष्टीकरण, कोई टिप्पणी, कोई परिचय, कोई विकल्प, कोई विकल्प नहीं।
-
प्रक्रिया स्मृति में वैसे ही स्थिर है। आप तुरंत इसे जारी रख सकते हैं`fg`. यह एक pause है, एक stop नहीं.
एक जॉब का पूरा जीवन चक्र
@startuml skinparam backgroundColor #FEFEFE skinparam defaultFontName sans-serif title शेल जॉब का पूर्ण जीवन चक्र state "अस्तित्वहीन" as none state "अग्रभूमि\n(टर्मिनल को घेरता है)" as foreground #LightCoral state "निलंबित\n(Ctrl+Z / SIGTSTP)" as suspended #LightYellow state "पृष्ठभूमि\n(bgまたは &)" as background #LightGreen state "समाप्त\n(exit code 0)" as done #LightGray [*] --> none none --> foreground : tape une commande foreground --> suspended : Ctrl+Z foreground --> done : fin normale suspended --> foreground : fg suspended --> background : bg suspended --> done : kill %n background --> foreground : fg background --> done : fin normale\n(en arrière-plan) background --> suspended : Ctrl+Z\n(si fg puis Ctrl+Z) done --> [*] note right of suspended L'état suspendu est le pivot de tout le système de jobs end note @enduml
@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultFontName sans-serif
rectangle "fg" as fg_ #SkyBlue {
card "सबसे हालिया जॉब (+)\nको वापस लाएं" as f1
card "किसी विशिष्ट जॉब को\nलक्ष्य बनाएं: fg %n" as f2
card "बदलें (Alternate): fg %-" as f3
}
rectangle "kill %n" as kill_ #LightCoral {
card "SIGTERM (साफ)" as k1
card "SIGKILL -9 (बलपूर्वक)" as k2
}
rectangle "disown" as disown #Lavender {
card "शेल से अलग करें\n(डिस्कनेक्ट होने पर भी जीवित रहता है)" as d1
}
rectangle "nohup + &" as nohup_ #LightGreen {
card "SIGHUP से सुरक्षित\nप्रोसेस\n(टर्मिनल बंद होने पर भी\nजीवित रहता है)" as n1
}
fg_ -right-> kill_ : si faut\nterminer
kill_ -right-> disown_ : ou détacher
nohup_ -left-> fg_ : fg ramène en\navant-plan
note bottom of disown_
disown` के बाद, `fg` अब जॉब को वापस नहीं ला सकता
end note
@enduml
fg नौकरी के साथ सबसे नया और अल्टरनेन्स
fg`कोई तर्क नहीं होने पर चिह्नित काम लौटाता है+(सबसे हालिया). लेकिन आप भी इसका उपयोग कर सकते हैं%-`पिछले जॉब को लक्ष्य करने के लिए :
$ vim file1.txt
^Z
[1]+ Stoppé vim file1.txt
$ vim file2.txt
^Z
[2]+ Stoppé vim file2.txt
$ fg # ramène job [2] (le plus récent)
$ fg %- # ramène job [1] (le précédent)
@startuml
skinparam backgroundColor #FEFEFE
rectangle "Ctrl+Z (SIGTSTP)" as z #LightGreen {
card "मेमोरी में प्रोसेस फ्रीज हो गया" as z1
card "fg इसे सुरक्षित वापस लाता है" as z2
card "कोई नुकसान नहीं" as z3
}
rectangle "Ctrl+C (SIGINT)" as c #LightCoral {
card "प्रोसेस समाप्त" as c1
card "स्थिति स्थायी रूप से खो गई" as c2
card "वापसी संभव नहीं है" as c3
}
note bottom of z
रोकें → फिर से शुरू करें
end note
note bottom of c
Kill → Perdu
end note
@enduml
$ jobs
[1]- Stoppé vim config.yml
[2]+ Stoppé ./gradlew test
$ kill %2 # envoie SIGTERM au job 2
$ kill -9 %1 # envoie SIGKILL au job 1 (force)
désown : शेल से अलग करें
disown`शेल की जॉब टेबल से एक जॉब हटाएँ। प्रक्रिया चलती रहती है लेकिन अब इसे वापस नहीं लाया जा सकता`fg:
$ ./gradlew build &
[1] 12345
$ disown %1
# Le processus continue mais n'est plus lié au shell
# Ça survives à la fermeture du terminal
nohup के साथ मिलाएँ लंबी प्रक्रियाओं के लिए
एक प्रक्रिया टर्मिनल बंद होने के बाद भी जीवित रहने के लिए :
$ nohup ./gradlew build &
[1] 12345
$ disown %1
# Le build continue même si vous fermez le terminal
@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultFontName sans-serif
rectangle "fg" as fg_ #SkyBlue {
card "जॉब लाओ\nसबसे हाल का (+)" as f1
card "एक नौकरी को लक्ष्य बनाएँ\nविशिष्ट : fg %n" as f2
card "बदलें : fg %-" as f3
}
rectangle "मारो %n" as kill_ #LightCoral {
card "SIGTERM (स्वच्छ)" as k1
card "SIGKILL -9 (बल)" as k2
}
rectangle "इन्कार करना" as disown #Lavender {
card "शेल से अलग करें\n(डिस्कनेक्शन के दौरान जीवित रहता है)" as d1
}
rectangle "nohup + &" as nohup_ #LightGreen {
card "इम्यूनाइज़्ड प्रक्रिया\nSIGHUP के खिलाफ\n(टर्मिनल के बंद होने पर जीवित रहता है)" as n1
}
fg_ -right-> kill_ : si faut\nterminer
kill_ -right-> disown_ : ou détacher
nohup_ -left-> fg_ : fg ramène en\navant-plan
note bottom of disown_
Après disown, fg ne peut
plus ramener le job
end note
@enduml
जाल और सामान्य त्रुटियाँ
Ctrl+Z और Ctrl+C को भ्रमित करना
यह सबसे सामान्य त्रुटि है।`Ctrl+C`प्रक्रिया को मारता है।`Ctrl+Z`वह निलंबित कर देता है। यदि आप दबाते हैं`Ctrl+C`reflex से, पूरी स्थिति खो जाती है — खुले फ़ाइलें, LLM सत्र, चल रहे बिल्ड।
@startuml
skinparam backgroundColor #FEFEFE
rectangle "Ctrl+Z (SIGTSTP)" as z #LightGreen {
card "स्मृति में जमी हुई प्रक्रिया" as z1
card "fg इसे सलामत लाता" as z2
card "कोई नुकसान नहीं" as z3
}
rectangle "Ctrl+C (SIGINT)" as c #LightCoral {
card "प्रक्रिया पूरी हुई" as c1
card "स्थायी रूप से खोयी हुई स्थिति" as c2
card "वापसी संभव नहीं" as c3
}
note bottom of z
Pause → Reprendre
end note
note bottom of c
Kill → Perdu
end note
@enduml
जॉब्स शेल के लिए स्थानीय होते हैं
jobs, fg et `bg`वे केवल उसी शेल में काम करते हैं जिसने प्रक्रियाओं को लॉन्च किया। यदि आप एक नया टर्मिनल खोलते हैं, तो आप दूसरे के जॉब्स नहीं देख पाएंगे।
@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultFontName sans-serif
skinparam ArrowColor #444444
title "fg` — वह टिप जो सब कुछ बदल देती है"
rectangle "**समस्या**" as problem #LightCoral {
card "किसी प्रोसेस के कारण\nटर्मिनल ब्लॉक हो गया" as p1
card "नया टर्मिनल खोलना = जटिल समाधान" as p2
}
rectangle "**समाधान**" as solution #LightGreen {
card "Ctrl+Z → सस्पेंड (suspend)" as s1
card "`fg` → पुन: शुरू करता है" as s2
card "`bg` → बैकग्राउंड में" as s3
card "`jobs` → सस्पेंडेड प्रोसेस देखें" as s4
}
rectangle "**लाभ**" as advantages #SkyBlue {
card "कॉन्टेक्स्ट का कोई नुकसान नहीं" as a1
card "किसी रीस्टार्ट की जरूरत नहीं" as a2
card "एक ही टर्मिनल पर्याप्त है" as a3
}
problem -right-> solution : "40 वर्षों से नेटिव\nUnix समाधान"
solution -right-> advantages : "परिणाम"
note bottom of advantages
fg कोई गुप्त टिप्स नहीं है
यह Unix shell का
एक मौलिक तंत्र है
end note
@enduml
सिस्टम-वाइड प्रक्रियाएँ देखने के लिए, उपयोग करें`ps` ou htop:
ps aux | grep vim
जॉब्स शेल बंद होने पर जीवित नहीं रहते।
यदि आप टर्मिनल बंद कर देते हैं, तो सभी निलंबित या बैकग्राउंड जॉब्स नष्ट हो जाते हैं। एक प्रक्रिया को जीवित रखने के लिए, उपयोग करें`nohup`+disown:
$ nohup ./gradlew build &
[1] 12345
$ disown %1
# Fermer le terminal → le build continue
@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultFontName sans-serif
rectangle "fg को कम क्यों\nआंका जाता है?" as why #LightCoral {
card "मल्टी-टैब टर्मिनल वाला\nIDE" as w1
card "ग्राफिकल टूल्स\nजो CLI की जगह लेते हैं" as w2
card "tmux/screen\nसमस्या को\nअलग तरह से हल करते हैं" as w3
}
rectangle "fg बेहतर क्यों\nहै?" as superior #LightGreen {
card "यूनिवर्सल: bash,\nzsh, fish, sh..." as s1
card "बिना निर्भरता के:\nकोई इंस्टॉलेशन नहीं" as s2
card "दो की-स्ट्रोक्स:\nCtrl+Z फिर fg" as s3
card "संदर्भ सुरक्षित:\nशून्य स्टेट लॉस" as s4
}
why -right-> superior : "सादगी\nहमेशा जीतती है"
@enduml
कुछ इंटरएक्टिव प्रोग्राम एक के बाद अच्छा प्रदर्शन नहीं करते`Ctrl+Z`+fg. यह दुर्लभ है लेकिन ऐसा होता है :
-
कुछ प्रोग्राम जो संकेतों का उपयोग करते हैं (vim, htop, less) अच्छी तरह से काम करते हैं`Ctrl+Z`)
-
लंबे नेटवर्क प्रोग्राम (ssh, opencode) सामान्यतः सही ढंग से पुनर्प्राप्त होते हैं
-
टर्मिनल (ncurses) को संशोधित करने वाले कार्यक्रम कभी‑कभी टर्मिनल को अपेक्षित नहीं स्थिति में छोड़ सकते हैं।
भ्रष्ट टर्मिनल के बाद एक`fg`, टाइप करें :
reset
@startuml skinparam backgroundColor #FEFEFE skinparam defaultFontName sans-serif participant "उपयोगकर्ता" as user participant "शेल" as shell participant "प्रक्रिया" as proc user -> shell : Ctrl+Z shell -> proc : SIGTSTP (signal 18) note right of proc : मेमोरी में जमी हुई प्रक्रिया user -> shell : fg shell -> proc : SIGCONT (signal 19) note right of proc : प्रक्रिया फिर से\nफोरग्राउंड में शुरू हो रही है user -> shell : bg shell -> proc : SIGCONT (signal 19) note right of proc : प्रक्रिया बैकग्राउंड में फिर से शुरू हो रही है user -> shell : Ctrl+C shell -> proc : SIGINT (signal 2) note right of proc : प्रक्रिया पूरी हुई\nस्थिति खो गई @enduml
@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultFontName sans-serif
skinparam ArrowColor #444444
title "fg — टिप्स जो सब कुछ बदल देते हैं"
rectangle "**समस्या**" as problem #LightCoral {
card "टर्मिनल अवरुद्ध\nएक प्रक्रिया द्वारा" as p1
card "नया\nटर्मिनल खोलना = भारी समाधान" as p2
}
rectangle "समाधान" as solution #LightGreen {
card "Ctrl+Z → निलंबित" as s1
card "fg → फिर से शुरू करता है" as s2
card "bg → पृष्ठभूमि में" as s3
card "jobs → voir les suspendus" as s4
}
rectangle "**लाभ**" as advantages #SkyBlue {
card "संदर्भ की हानि नहीं" as a1
card "रीस्टार्ट नहीं" as a2
card "एक टर्मिनल पर्याप्त है" as a3
}
problem -right-> solution : "Unix का स्वाभाविक समाधान 40 वर्षों से"
solution -right-> advantages : "परिणाम"
note bottom of advantages
fg n'est pas un tips obscur
C'est un mécanisme fondamental
du shell Unix
end note
@enduml
fg क्यों कम आंका गया
अधिकांश आधुनिक डेवलपर्स खोजते हैं`fg`देर से, या कभी नहीं। कुछ कारण :
-
IDE टर्मिनल छुपाते हैं: VS Code एक इंटीग्रेटेड टर्मिनल प्रदान करता है, लेकिन कई टैब बनाते हैं`fg`दिखने में कम आवश्यक
-
ग्राफ़िकल टूल्स CLI को प्रतिस्थापित करते हैं: फ़ाइल प्रबंधक, सिस्टम मॉनिटर, ग्राफ़िकल Git क्लाइंट
-
tmux और स्क्रीन: ये मल्टीप्लेक्सर्स एक ही समस्या को अलग तरीके से हल करते हैं, लेकिन`fg`यह अधिक सरल और हमेशा उपलब्ध है
फिर भी,fg# JBake CLI Commands ` # Initialize a new JBake project jbake -i