เคล็ดลับเจ๋งๆ ของคำสั่ง fg : เมื่อ Ctrl+Z บันทึกเซสชันเทอร์มินัลของคุณ
เผยแพร่เมื่อ 18 April 2026
- ปัญหา: เทอร์มินัลไม่ว่าง
- สามคำสั่งที่จำเป็น
- สถานการณ์ที่ 1: บิลด์ที่ยาวนาน
- สถานการณ์ที่ 2: บรรณาธิการที่ถูกลืม
- สถานการณ์ที่ 3: โปรเซส opencode ที่ถูกระงับ
- สถานการณ์ที่ 4: จัดการหลายงานพร้อมกัน
- ความแตกต่างระหว่าง fg, bg, Ctrl+Z, Ctrl+C และ &
- วงจรชีวิตที่สมบูรณ์ของงาน
- เคล็ดลับขั้นสูง
- หลุมพรางและข้อผิดพลาดที่พบบ่อย
- แผนภาพสรุป
- ทำไม fg จึงถูกประเมินต่ำเกินไป
- บันทึกทางเทคนิค: สัญญาณ
- บทสรุป
- เอกสารอ้างอิง
คุณกำลังเริ่ม`./gradlew build`, เทอร์มินัลค้างเป็นเวลา 3 นาที และคุณจำเป็นต้องทำอย่างอื่น ในระหว่างนั้น ใช่ไหม? ไม่จำเป็นต้องเปิดแท็บใหม่`Ctrl+Z`ระงับกระบวนการ,`fg`นำมันกลับไปยังจุดเดิมที่คุณทิ้งไว้พอดี นี่คือทิป Unix ที่ถูกประเมินต่ำที่สุดในชีวิตประจำวันของนักพัฒนา
ปัญหา: เทอร์มินัลไม่ว่าง
นักพัฒนาทุกคนเคยเจอสถานการณ์นี้:
$ ./gradlew build
> Building...
เทอร์มินัลค้างอยู่ คุณไม่สามารถพิมพ์คำสั่งใด ๆ ได้อีกแล้ว และคุณจำเป็นต้องเปิดดูไฟล์ เรียกใช้`git status`, หรือตรวจสอบพอร์ตที่ถูกใช้งานอยู่
@startuml skinparam backgroundColor #FEFEFE actor Développeur as dev participant "Terminal" as term participant "Gradle\n( กระบวนการ )" as gradle dev -> term : ./gradlew สร้าง term -> gradle : รันบิลด์ gradle -> term : ใช้งานเทอร์มินัล\n(ไม่มีพรอมต์) dev -> term : ต้องการพิมพ์คำสั่ง term --> dev : เทอร์มินัลถูกบล็อก note right of dev ผู้พัฒนาเป็น อยู่ในภาวะอัมพาตระหว่าง ตลอดระยะเวลาการ 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 "เบื้องหน้า\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 "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`, คุณจำเป็นต้องดูไฟล์อื่น โดยไม่ ออกจาก`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
No source text was provided to translate. Please send the French text you’d like translated into Thai.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é
ข้อได้เปรียบมีสองประการ:
-
ไม่มีการสูญเสียบริบท: เซสชัน 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 "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
สรุปคำสั่งเกี่ยวกับงาน
| คำสั่งซื้อ | เอฟเฟกต์ | ตัวอย่าง |
|---|---|---|
|
ระงับกระบวนการเบื้องหน้า |
การส่ง`SIGTSTP` |
|
ดำเนินงานเริ่มต้นต่อในโฟร์กราวด์ |
|
|
ทำ job n ต่อในเบื้องหน้า |
|
|
ดำเนินการงานเริ่มต้นต่อในเบื้องหลัง |
|
|
ทำงาน n ต่อในเบื้องหลัง |
|
|
แสดงรายการงานของเชลล์ปัจจุบัน |
|
|
ทำงาน n ให้เสร็จ |
|
ความแตกต่างระหว่าง 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
| ทางลัด/คำสั่ง | สัญญาณ | ผล | ย้อนกลับไปหรือ? |
|---|---|---|---|
|
|
ระงับกระบวนการ (ค้าง, ในหน่วยความจำ) |
ใช่:`fg` ou |
|
|
ฆ่าโปรเซส (เสร็จสิ้น) |
ไม่ : กระบวนการถูกทำลาย |
|
|
ฆ่าโปรเซส + core dump |
ไม่: กระบวนการถูกทำลาย |
|
กรุณาใส่ข้อความภาษาฝรั่งเศสที่ต้องการให้แปลด้วยค่ะ |
เรียกใช้ในเบื้องหลังโดยตรง |
`fg`เพื่อนำมันกลับมาสู่เบื้องหน้า |
Ctrl+Z`เป็นไม่ทำลาย. กระบวนการถูกหยุดไว้ตามสภาพเดิมในหน่วยความจำ คุณสามารถกลับมาดำเนินการต่อได้ทันทีด้วย`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`เมื่อไม่มีอาร์กิวเมนต์ จะคืนงานที่ถูกทำเครื่องหมาย+(ใหม่ที่สุด) แต่คุณยังสามารถใช้%-`เพื่อกำหนดเป้าหมายงานก่อนหน้า:
$ 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)
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 "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 "โปรเซสถูกหยุดชั่วคราวในหน่วยความจำ" 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
ฆ่า → แพ้
end note
@enduml
jobs เป็นเฉพาะภายใน shell
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`Please provide the French text you’d like me to translate into Thai.
ps aux | grep vim
งานจะไม่คงอยู่หลังจากการปิดเชลล์
หากคุณปิดเทอร์มินัล งานที่ถูกระงับหรือทำงานอยู่เบื้องหลังทั้งหมดจะถูกทำลาย เพื่อให้โพรเซสหนึ่งอยู่รอด ให้ใช้`nohup`No source text was provided to translate. Please send the French text you’d like translated into Thai.`disown`The text to translate is missing. Please provide the French text you’d like me to translate into Thai.
$ nohup ./gradlew build &
[1] 12345
$ disown %1
# Fermer le terminal → le build continue
โปรเซสแบบโต้ตอบและ fg
โปรแกรมโต้ตอบบางโปรแกรมทำงานได้ไม่ดีนักหลังจาก`Ctrl+Z`No source text was provided to translate.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 "เปิดเทอร์มินัลใหม่\n= ทางแก้ที่ยุ่งยาก" as p2
}
rectangle "**วิธีแก้**" as solution #LightGreen {
card "Ctrl+Z → หยุดชั่วคราว" 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 : "โซลูชันเนทีฟของ\nUnix ที่มีมานาน 40 ปี"
solution -right-> advantages : "ผลลัพธ์"
note bottom of advantages
fg ไม่ใช่เคล็ดลับที่คลุมเครือ
มันเป็นกลไกพื้นฐาน
ของเชลล์ Unix
end note
@enduml
ทำไม fg จึงถูกประเมินต่ำเกินไป
นักพัฒนาสมัยใหม่ส่วนใหญ่ค้นพบ`fg`ช้า หรืออาจจะไม่เลยก็ได้ เหตุผลบางประการ:
-
IDE ซ่อนเทอร์มินัล: VS Code มีเทอร์มินัลในตัว แต่แท็บหลายแท็บทำให้`fg`ดูเหมือนจะจำเป็นน้อยลง
-
เครื่องมือกราฟิกแทนที่ CLI: ตัวจัดการไฟล์, โปรแกรมตรวจสอบระบบ, ไคลเอนต์ Git แบบกราฟิก
-
tmux และ screen: มัลติเพล็กเซอร์เหล่านี้แก้ปัญหาเดียวกันด้วยวิธีที่ต่างกัน แต่`fg`ง่ายกว่าและพร้อมใช้งานเสมอ
อย่างไรก็ตาม`fg`คือ :
-
สากล: มีอยู่ในเชลล์ POSIX ทั้งหมด (bash, zsh, fish…)
-
โดยไม่ต้องพึ่งพา: ไม่จำเป็นต้องติดตั้ง tmux หรือ screen
-
สแนปช็อต: การโจมตีสองครั้ง (
Ctrl+Z`แล้ว`fg) เพื่อหยุดชั่วคราวและดำเนินการต่อ -
ตัวรักษาบริบท: สถานะของกระบวนการยังคงสมบูรณ์
@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultFontName sans-serif
rectangle "ทำไม fg จึง\nถูกประเมินต่ำเกินไป ?" as why #LightCoral {
card "IDE พร้อมเทอร์มินัล\nหลายแท็บ" 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 |
|
|
การขัดจังหวะ — ยุติกระบวนการ |
3 |
|
|
ออกพร้อม core dump |
18 |
|
|
หยุดแบบโต้ตอบ — ระงับกระบวนการ |
19 |
|
|
ดำเนินการต่อ — กลับมาดำเนินกระบวนการที่ถูกระงับ |
15 |
|
|
การสิ้นสุดอย่างเรียบร้อย |
9 |
|
|
การยุติแบบบังคับ (ไม่สามารถสกัดกั้นได้) |
โฟลว์ทั้งหมด:
@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 : โปรเซสที่ค้างอยู่\nในหน่วยความจำ user -> shell : fg shell -> proc : SIGCONT (signal 19) note right of proc : โปรเซสกลับมาดำเนินการต่อในโฟร์กราวด์ 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`ไม่ใช่เคล็ดลับที่คลุมเครือ — มันเป็นกลไกพื้นฐานของเชลล์ Unix ที่มีให้ใช้มาตั้งแต่ทศวรรษ 1970 การที่นักพัฒนาส่วนใหญ่ไม่รู้เรื่องนี้เป็นอาการของยุคสมัยของเรา: IDE และมัลติเพล็กเซอร์ทำให้เราห่างไกลจากพื้นฐาน
แต่เมื่อคุณอยู่บนเซิร์ฟเวอร์ SSH ในเทอร์มินัลแบบมินิมัล หรือเพียงแค่กำลังใช้`opencode`และที่ LLM กำลังทำงานอย่างเต็มที่ —Ctrl+Z, fg, bg, `jobs`เป็นเพื่อนที่ดีที่สุดของคุณ
Please provide the French text you’d like me to translate into Thai. Ctrl+Z หยุดชั่วคราว, fg กลับมาทำงานต่อ นี่คือปุ่มหยุด-เล่นของเทอร์มินัล No text was provided to translate (the message contains only "__"). Please send the French text you’d like translated into Thai.
เอกสารอ้างอิง
-
man bash— ส่วนการควบคุมงาน -
man signal— รายการสัญญาณ POSIX