विषय-सूची
पढ़ने का समय : 10 minutes

आप फेंकते हैं`./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é

फ़ायदा दोगुना है :

  1. कोई संदर्भ हानि नहींLLM सत्र, वार्तालाप का इतिहास, खुले फ़ाइलें — सब कुछ संरक्षित है

  2. रीबूट नहीं: 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

कार्यों के आदेशों का सारांश

आदेश प्रभाव उदाहरण

Ctrl+Z

प्रक्रिया को अग्रभूमि में निलंबित करें

भेजने का`SIGTSTP`

fg

डिफ़ॉल्ट जॉब को फ़ोरग्राउंड में फिर से शुरू करें

fg ou fg %1

fg %n

जॉब अग्रभूमि में फिर से शुरू करता है

fg %2

bg

डिफ़ॉल्ट जॉब को पृष्ठभूमि में फिर से शुरू करें

bg ou bg %1

bg %n

न के जॉब को पृष्ठभूमि में फिर से शुरू करें

bg %2

jobs

वर्तमान शेल के कार्यों की सूची बनाएँ

jobs -l(PID के साथ)

kill %n

job completo करो n

kill %2

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
शॉर्टकट/कमांड सिग्नल प्रभाव वापस लौटना?

Ctrl+Z

SIGTSTP

प्रक्रिया को निलंबित करें (जमा, मेमोरी में)

हाँ :`fg` ou bg

Ctrl+C

SIGINT

प्रक्रिया को मारें (समाप्त)

नहीं: नष्ट प्रक्रिया

Ctrl+\

SIGQUIT

प्रक्रिया मारो + core dump

नहीं : नष्ट प्रक्रिया

commande &

बैकग्राउंड में सीधे लॉन्च करें

`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 में अनुवाद करें सभी बैकटिक कोड स्पैन (…​) को बिल्कुल वैसा ही रखें — बैकटिक की सामग्री, स्पेसिंग, या स्थिति कभी न बदलें। यह पाठ बड़े वाक्य का एक अंश हो सकता है — अंश का अनुवाद अधिक संदर्भ मांगे बिना करें। केवल अनुवादित पाठ आउटपुट करें — कोई स्पष्टीकरण, कोई टिप्पणी, कोई परिचय, कोई विकल्प, कोई विकल्प नहीं।

  1. प्रक्रिया स्मृति में वैसे ही स्थिर है। आप तुरंत इसे जारी रख सकते हैं`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`देर से, या कभी नहीं। कुछ कारण :

  1. IDE टर्मिनल छुपाते हैं: VS Code एक इंटीग्रेटेड टर्मिनल प्रदान करता है, लेकिन कई टैब बनाते हैं`fg`दिखने में कम आवश्यक

  2. ग्राफ़िकल टूल्स CLI को प्रतिस्थापित करते हैं: फ़ाइल प्रबंधक, सिस्टम मॉनिटर, ग्राफ़िकल Git क्लाइंट

  3. tmux और स्क्रीन: ये मल्टीप्लेक्सर्स एक ही समस्या को अलग तरीके से हल करते हैं, लेकिन`fg`यह अधिक सरल और हमेशा उपलब्ध है

फिर भी,fg# JBake CLI Commands ` # Initialize a new JBake project jbake -i

Bake (generate) the site jbake -b

संबंधित लेख