پڑھنے کا وقت : 10 minutes

آپ ڈھکیل رہے ہیں`./gradlew build`، ٹرمینل 3 منٹ کے لیے مسدود ہے، اور آپ کو کسی اور کام کرنے کی ضرورت ہے انتیظار کرتے ہوئے؟ نیا ٹیب کھولنا ضروری نہیں ہے۔`Ctrl+Z`یہ پراسیس کو سسٹمنڈ کرتا ہے،`fg`یہ وہ جگہ لے آتا ہے جہاں آپ نے اسے چھوڑا تھا۔ یہ Unix کی سب سے قلیلَقدر tip ہے ایک ڈیویلیپر کے روزمرہ زندگی میں۔

مشكلہ: ایک مصروف ٹرمینل

ہر ڈویلپر نے اس حالت کا سامنا کیا ہے:

$ ./gradlew build
> Building...

ٹرمینل بلاک ہو گیا. اب آپ کوئی بھی کمانڈ ٹائپ نہیں کر سکتے. اور آپ کو ایک فائل دیکھنے اور ایک چلانے کی ضرورت ہے.git status, یا مشغول پورٹ کی جانچ کریں۔

@startuml
skinparam backgroundColor #FEFEFE

actor Développeur as dev
participant "Terminal" as term
participant "Gradle\n( processus )" 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
  Le développeur est
  paralysé pendant
  toute la durée du build
end note
@enduml

اکثر ڈویلپرز ایک نیو ٹرمنیل کھولتے ہیں۔ لیکن ایک زیادہ خوبصورت، تیزی سے اور نیٹیو حل موجود ہے: جوبز کی منیجمنٹ۔

تین ضروری کامینڈز

Ctrl+Z — متوقف کرنا (SIGTSTP)

`Ctrl+Z`سیگنال بھیجیں`SIGTSTP`امامی پروسیس تک. پروسیس ہےمعطل— نہیں مارا — اور ٹرمینل اپنی پرامپٹ پر واپس آ جاتا ہے.

$ ./gradlew build
> Building...
^Z
[1]+  Stoppé    ./gradlew build
$

کچ بریکٹس میں عدد`[1]`ہےجوب نمبر. 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 "Avant-plan\n(terminal bloqué)" as fg #LightCoral
state "Suspendu\n(Ctrl+Z)" as stopped #LightYellow
state "Arrière-plan\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
  Le processus est figé
  mais _pas_ tué
end note

note left of bg_
  Le terminal est libre
  le build continue
end note
@enduml

سيناريو 1 : لمبي بنائید

یہ استعمال کا سب سے عام مثال ہے۔ آپ گرائیڈل بِلڈ چلاتے ہیں، ٹرمنال مسدود ہو جاتا ہے، اور آپ کو کچھ اور کرنے کی ضرورت ہے۔

@startuml
skinparam backgroundColor #FEFEFE
autonumber

actor Développeur as dev
participant "Terminal" as term
participant "Gradle" as gradle
database "Etat\nprocessus" 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
  Le processus Gradle
  n'a jamais été tué
  Il reprend exactement
  où il s'était arrêté
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`, آپ کو کسی اور فائل کو sans چھوڑ کر دیکھنے کی ضرورت ہے`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 "Shell" 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 restaure
  intégralement l'état :
  position du curseur,
  buffer, undo stack
end note
@enduml

(Translation of empty French string is empty Urdu string, so output is nothing)`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 agent)" 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 arrive
  en plein milieu
  d'une analyse de code
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
  Aucune perte de contexte
  Le LLM reprend sa réponse
  exactement où il en était
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 کو masalah کو دوبارہ وضاحت کرنے کی ضرورت نہیں

سيناريو 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 "Jobs suspendus" as jobs #LightYellow {
  card "[1] vim config.yml" as j1
  card "[2] ./gradlew test" as j2
  card "[3] htop" as j3
}

rectangle "Actions" as actions #LightGreen {
  card "fg %2\n→ avant-plan" as a1
  card "bg %3\n→ arrière-plan" as a2
  card "fg %1\n→ avant-plan" as a3
}

jobs --> actions : fg/bg + numéro de job
actions --> j2 : Reprend
actions --> j3 : En arrière-plan

note bottom of jobs
  Chaque job conserve
  son état exact
  entre les suspend/resume
end note
@enduml

جوبز کے کمانڈز کا خلاصہ

حکم اثر مثال

Ctrl+Z

سامنے کے پروسس کو معلاق کرو

بھیجنا کا`SIGTSTP`

fg

ڈیفالٹ جاب کو فورگراؤنڈ میں دوبارہ لاؤ

fg ou fg %1

fg %n

کام n کو سامنے میں دوبارہ شروع کیا جاتا ہے

fg %2

bg

یہ پیش‌فرض کام پس‌زمینی میں دوبارہ شروع کرتا ہے

bg ou bg %1

bg %n

نوکری n کو پیش‌زمینہ میں جاری رکھیں

bg %2

jobs

موجودہ شیل کے جابس کی فہرست بنائیں

jobs -l(PID کے ساتھ)

kill %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 "Suspend le processus\n(il est toujours en mémoire)\nUtilisable avec fg/bg" as c1
}

rectangle "**Ctrl+C**\nSIGINT" as ctrlc #LightCoral {
  card "Tue le processus\n(pas de retour possible)\nPerte de tout l'état" as c2
}

rectangle "**& **\n(arrière-plan)" as ampersand #LightGreen {
  card "Lance directement\nen arrière-plan\nTerminal libre immédiatement" as c3
}

rectangle "**fg**\n(foreground)" as fg_ #SkyBlue {
  card "Ramène un job\nsuspendu en avant-plan\nTerminal occupé" as c4
}

rectangle "**bg**\n(background)" as bg_ #Lavender {
  card "Reprend un job\nsuspendu en arrière-plan\nTerminal libre" 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
  Le processus est **figé**
  mais **pas tué**
end note

note bottom of ampersand
  Alternative : lancer
  ./gradlew build &
  directement en arrière-plan
end note
@enduml
شورتکٹ/کمانڈ سگنال اثر واپس جائیں؟

Ctrl+Z

SIGTSTP

پروسیس روک دیں (جمد، memori mein)

ہاں :`fg` ou bg

Ctrl+C

SIGINT

پروسيس کو قتل کریں (مکمل)

نہیں : پروسس تباہ شدہ

Ctrl+\

SIGQUIT

پروسيس کو قتل کریں + کور ڈامپ

نہ : عمل متلف

commande &

—

بیک گراؤنڈ میں مستقیم چلائیں

`fg`اس کو آگے لانا

Ctrl+Z`ہےغیر-تخrierte. عمل مکمل طور پر منجمد ہے، جیسا ہے، ذِخْرَہ میں۔ آپ فوراً دوبارہ شروع کر سکتے ہیں ساتھ`fg. یہ ایک pause ہے، ایک stop نہیں۔

إیک جاب کا مکمل حیاتی دور

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultFontName sans-serif

title Cycle de vie complet d'un job shell

state "Non existant" as none
state "Avant-plan\n(occupe le terminal)" as foreground #LightCoral
state "Suspendu\n(Ctrl+Z / SIGTSTP)" as suspended #LightYellow
state "Arrière-plan\n(bg ou &)" as background #LightGreen
state "Terminé\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

پیشگی نکات

fg سب سے حالیوں جوب اور تبدیلی کے ساتھ

fg`کسی استدلال کے بغیر مارک کردہ نوکری واپس لایا جاتا ہے+(سب سے تازہ). لیکن آپ بھی استعمال کر سکتے ہیں%-`پہلی نوکری ko هدف بنانے کے لیے :

$ 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)

ایک نوکری کو صاف ستھرا کر ختم کرنا

$ 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)

ڈساؤن : شیل سے الگ کرنا

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 ./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 "Ramène le job\nle plus récent (+)" as f1
  card "Cible un job\nspécifique : fg %n" as f2
  card "Alterne : fg %-" as f3
}

rectangle "kill %n" as kill_ #LightCoral {
  card "SIGTERM (propre)" as k1
  card "SIGKILL -9 (force)" as k2
}

rectangle "disown" as disown #Lavender {
  card "Détache du shell\n(survit à la déconnexion)" as d1
}

rectangle "nohup + &" as nohup_ #LightGreen {
  card "Processus immunisé\ncontre SIGHUP\n(survit à la fermeture\ndu terminal)" 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`عکس کے طور پر، ساری حالت ضائع ہو جاتی ہے — کھولے گئے فائلز، LLM سیشنز، جاری بنڈنگ۔

@startuml
skinparam backgroundColor #FEFEFE

rectangle "Ctrl+Z (SIGTSTP)" as z #LightGreen {
  card "میموری میں منجمد عمل (Process)" 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, fg et `bg`وہ صرف اسی شیل میں کام کرتے ہیں جس نے ان پروسیسز کو چلایا ہے۔ اگر آپ نया ٹرمینل کھولیں گے تو آپ دوسرے کے جوبز نہیں دیکھ پائیں گے۔

# Terminal 1
$ vim file.txt
^Z
[1]+  Stoppé    vim file.txt

# Terminal 2 (nouveau)
$ jobs
# (rien — les jobs sont locaux au shell)

سیسٹم وسیع پروسیز دیکھنے کے لیے استعمال کریں`ps` ou htop:

ps aux | grep vim

جوبز شیل کے بند ہونے پر بقی نہیں رہتے

اگر آپ ٹرمنل بند کر دیں، تو تمام سسپینڈ یا بیک گراؤنڈ جابس مٹا دیے جاتے ہیں۔ ایک پروسس کے بچنے کے لیے استعمال کریں`nohup`+disown :

$ nohup ./gradlew build &
[1] 12345
$ disown %1
# Fermer le terminal → le build continue

انٹرایکٹو پروسیسز اور fg

کچھ تعاملی پروگرام ایک کے بعد اچھی طرح سے کام نہیں کرتے`Ctrl+Z`+fg. یہ کم ہوتا ہے، لیکن ہوتا ہے:

  • کسی پروگرام جو سیگنالات استعمال کرتے ہیں (vim, htop, less) اچھی طرح سے کام کرتے ہیں`Ctrl+Z`)

  • لمبی مدت تک چلنے والے نیٹ ورک کے پروگرام (ssh, opencode) عام طور پر درست انداز سے بازیاب ہو جاتے ہیں

  • جیسے پروگرام جو ٹرمینل کو تبدیل کرتے ہیں (ncurses) گاهی ٹرمینل کو غیر متوقع حالت میں چھوڑ دیتے ہیں

کروپٹ ٹرمینل کے بعد ایک`fg`, ٹائپ کریں :

reset

خلاصہ ڈائگرام

@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` → پس منظر (background) میں بھیجتا ہے" as s3
  card "`jobs` → معطل پروسیسز کو دیکھنا" as s4
}

rectangle "**فوائد**" as advantages #SkyBlue {
  card "سیاق و سباق (context) کا کوئی نقصان نہیں" as a1
  card "دوبارہ شروع کرنے کی ضرورت نہیں" as a2
  card "ایک ہی ٹرمینل کافی ہے" as a3
}

problem -right-> solution : "40 سال پرانا\nنیٹیو Unix حل"
solution -right-> advantages : "نتیجہ"

note bottom of advantages
fg کوئی مبہم ٹپ نہیں ہے
یہ ایک بنیادی میکانزم ہے
Unix shell کا
end note
@enduml

fg کم تر کمیت کیوں ہے

بیشتر مودرن ڈویلپرز کھوجتے ہیں`fg`دیر، یا کبھی نہیں۔ کئی دلائل:

  1. IDE ٹرمینال چھپتے ہیںVS Code ایک انٹیگریٹڈ ٹرمینل پیش کرتا ہے، لیکن متعدد ٹابس بناتے ہیں`fg`ظاہراً کم ضروری

  2. گرافیکی اوزار سی ایل آئی کی جگہ لے رہے ہیں: فائلز کے منیجرز، نظام کے مانیٹرز، گِٹ کے گرافیک کلائنٹس

  3. tmux اور screenyah multiplexers یکساں masalah مختلف طریقے سے حل کرتے ہیں،磁器`fg`یہ آسان ہے اور ہمیشہ قابل دستیاب ہے

تاهم,`fg`ہے :

  1. عالمیPOSIX شیلز (bash, zsh, fish…​) میں موجود

  2. غیر وابستہ: انسٹال کرنے کی ضرورت نہیں tmux یا screen

  3. سنسپیشوٹ: دو ضربات`Ctrl+Z`پھر`fg`)متوقف کرنے اور دوبارہ شروع کرنے کے لیے

  4. سیاق و سباق کا محافظ: عمل کی حالت سالم ہے

@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

تکنیکی مذکرہ : سگنالات

مُتَجَسِّسوں کے لیے، یہ شامل سیگنالز :

اشارہ نام بجائے بھیجا گیا اثر

2

SIGINT

Ctrl+C

انقطاع — عمل کو ختم کرتا ہے

3

SIGQUIT

Ctrl+\

کور ڈمپ کے ساتھ خروج

18

SIGTSTP

Ctrl+Z

مفاعلی سٹاپ — عمل روک دیں

19

SIGCONT

fg/bg

جاری رکھے — متوقف عمل کو دوبارہ شروع کرتا ہے

15

SIGTERM

kill %n

صاف اختتام

9

SIGKILL

kill -9 %n

مجبور خاتمہ (روکنا ناممکن)

مکمل فلو :

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultFontName sans-serif

participant "صارف" as user
participant "شیل" as shell
participant "عمل (Processus)" 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

نتیجہ

`fg`یہ ایک مخفی tips نہیں — یہ یونیکس شیل کا بنیادی مکانیزم ہے، 1970 کے سالوں سے دستیاب ہے۔ حقیقت یہ کہ زیادہ تر ڈویلپر اسے نظرانداز کر رہے ہیں، ہماری دور کا ایک علامت ہے: IDE اور multiplexers نے ہمیں بنیادیوں سے door کر دیا۔

لیکن جب آپ ایک SSH سرور پر ہیں، ایک کم از کم ٹرمینل میں، یا صرف استعمال کر رہے ہیں`opencode`اور اس لئے LLM مکمل طور پر کام کر رہا ہے —Ctrl+Z, fg, bg, `jobs`آپ کے بہترین دوست ہیں

_ Ctrl+Z suspend, fg resume. یہ ٹرمینل کی pause-play ہے۔ _

متعلقہ مضامین