Το super tip για την εντολή `fg`: όταν το Ctrl+Z σώζει τη συνεδρία του τερματικού σας
Δημοσιεύτηκε 18 April 2026
- Το πρόβλημα : ένα απασχολισμένο τερματικό
- Οι τρεις απαραίτητες εντολές
- Σενάριο 1 : Η μακρή σύνθεση
- Σενάριο 2: Ο ξεχασμένος επεκτυπωτής
- Σενάριο 3 : Η διαδικασία opencode είναι ανασταλμένη
- Σενάριο 4 : Διαχείριση πολλαπλών εργασιών ταυτόχρονα
- Διαφορές μεταξύ fg, bg, Ctrl+Z, Ctrl+C και &
- Ο πλήρης κύκλος ζωής ενός job
- Προχωρημένα συμβουλές
- Παγίδες και συνηθισμένα λάθη
- Συνοπτικό διάγραμμα
- Γιατί το fg είναι υποτιμημένο;
- Μνημονική τεχνική: τα σήματα
- Συμπέρασμα
Εκκινείτε`./gradlew build`, Το τερματικό είναι κλειδωμένο για 3 λεπτά, και χρειάζεστε να κάνετε κάτι άλλο εν ορίζοντας ? Δεν χρειάζεται να ανοίξετε ένα νέο καρτέλα.`Ctrl+Z`συσταμάτησέ τη διεργασία`fg`Το επιστρέφει ακριβώς εκείπου το αφήσατε. Είναι το πιο υποεκτεινόμενο tip Unix της καθημερινότητας ενός προγραμματιστή.
Το πρόβλημα : ένα απασχολισμένο τερματικό
Κάθε προγραμματιστής έχει γνωρίσει αυτή την κατάσταση:
$ ./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 Ο προγραμματιστής παραμένει ακίνητος για όλη τη διάρκεια του build end note @enduml
Οι περισσότεροι προγραμματιστές ανοίγουν ένα νέο τερματικό. Υπάρχει όμως μια πιο ελκυστική, πιο γρήγορη, και εγγενής λύση: η διαχείριση των εργασιών.
Οι τρεις απαραίτητες εντολές
Ctrl+Z — Παύση (SIGTSTP)
`Ctrl+Z`στείλε το σήγμα`SIGTSTP`στη διαδικασία στο προσκήνιο. Η διαδικασία είναιαναστέλλετος— δεν σκοτώθηκε — και το τερματικό επιστρέφει στη προτροπή του.
$ ./gradlew build
> Building...
^Z
[1]+ Stoppé ./gradlew build
$
Ο αριθμός μεταξύ των αγκυλών`[1]`είναι τοαριθμός εργασίας. Le `+`δηλώνει την προεπιλεγμένη εργασία.
fg — Επαναφορά στο προσκήνιο
`fg`Φέρνει το suspensed job στο προσκήνιο. Η διαδικασία συνεχίζει ακριβώς εκεί जहां είχε σταματήσει.
$ fg
./gradlew build
> Building... (reprend où il en était)
Με έναν συγκεκριμένο αριθμό εργασίας:
$ fg %2
bg — Επαναλαμβάνω στο παρασκήνιο
`bg`Συνεχίστε τη διαδικασία χωρίς να μπλοκάρετε το τερματικό. Ιδανικό για τα μεγάλα builds.
$ bg
[1]+ ./gradlew build &
$
Le `&`στο τέλος σημαίνει ότι η διαδικασία τρέχει στο παρασκήνιο.
jobs — Λίστα των jobs του shell
$ 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_ Το τερμινάλ είναι ελεύθερο το build συνεχίζεται end note @enduml
Σενάριο 1 : Η μακρή σύνθεση
Αυτή είναι η πιο συνήθης περίπτωση χρήσης. Εκτελείτε μια Gradle build, το τερματικό είναι κολλημένο, και χρειάζεστε να κάνετε κάτι άλλο.
@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 επαναφέρει πλήρως την κατάσταση: θέση του κέρσορα, buffer, undo stack end note @enduml
vim`επαναφέρει τέλεια την κατάσταση του μετά ένα`fg: θέση του κέρσορα, περιεχόμενο του buffer, ιστορικό αναιρέσεων — όλο είναι διατηρημένο.
|
Σενάριο 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 n στο προσκήνιο |
|
|
Επαναλαμβάνει την προεπιλεγμένη εργασία στο παρασκήνιο |
|
|
Συνεχίστε την εργασία n στο παρασκήνιο |
|
|
Εμφάνισε τα jobs του τρέχοντος κελύφους |
|
|
Τερματισέ τη εργασία n |
|
Διαφορές μεταξύ fg, bg, Ctrl+Z, Ctrl+C και &
Πολλούς προγραμματιστές διαλούν αυτούς τους μηχανισμούς. Αυτή είναι μια αποφάσιστική διευκρίνιση.
@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultFontName sans-serif
rectangle "**Ctrl+Z**\nSIGTSTP" as ctrlz #LightYellow {
card "Αναστέλλει τη διαδικασία\n(παραμένει στη μνήμη)\nΧρήσιμο με fg/bg" as c1
}
rectangle "**Ctrl+C**\nSIGINT" as ctrlc #LightCoral {
card "Τερματίζει τη διαδικασία\n(δεν υπάρχει επιστροφή)\nΑπώλεια όλης της κατάστασης" as c2
}
rectangle "**& **\n(background)" 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
Η διαδικασία είναι **παγωμένη**
αλλά **όχι τερματισμένη**
end note
note bottom of ampersand
Εναλλακτική: εκτέλεση
`./gradlew build &`
απευθείας στο παρασκήνιο
end note
@enduml
| σύντομη/εντολή | Σήμα | Επίδραση | Πίσω; |
|---|---|---|---|
|
|
Υποβάλε τη διαδικασία (καταγεμμένη, στη μνήμη) |
Ναι :`fg` ou |
|
|
Κτάνε τη διαδικασία (ολοκληρωμένη) |
Όχι : διαδικασία καταστραμμένη |
|
|
Στονέστε τη διαδικασία + core dump |
Όχι: η διαδικασία έχει καταστραφεί |
|
— |
Εκκίνησε στο παρασκήνιο άμεσα |
`fg`για να το φέρνω στο προσκήνιο |
Ctrl+Z`είναιμη-καταστροφικό. Η διαδικασία είναι παγωμένη ως είναι, στη μνήμη. Μπορείτε να συνεχίσετε άμεσα με`fg. Είναι ένα pause, όχι ένα stop.
|
Ο πλήρης κύκλος ζωής ενός job
@startuml skinparam backgroundColor #FEFEFE skinparam defaultFontName sans-serif title Πλήρης κύκλος ζωής μιας εργασίας shell 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 Η ανάρτηση κατάστασης είναι ο κεντρικός άξονας ολόκληρου του συστήματος εργασιών 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 : αποσπορά από το shell
disown`Supprime un travail de la table des travaux du shell. Le processus continue de tourner mais ne peut plus être ramené avec`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 "kill %n" as kill_ #LightCoral {
card "SIGTERM (καθαρό)" as k1
card "SIGKILL -9 (αναγκαστικό)" as k2
}
rectangle "disown" as disown #Lavender {
card "Αποσύνδεση από το shell\n(επιβιώνει από την αποσύνδεση)" as d1
}
rectangle "nohup + &" as nohup_ #LightGreen {
card "Διαδικασία ανοσού\nστο SIGHUP\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 δεν μπορεί
πλέον να επαναφέρει το 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
Kill → Χαμένος
end note
@enduml
Οι εργασίες είναι τοπικές στο κελύφος
jobs, fg et `bg`Λειτουργούν μόνο στο shell που ξεκίνησε τις διαδικασίες. Αν ανοίξετε ένα νέο τερματικό, δεν θα δείτε τα jobs του άλλου.
# 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
Οι εργασίες δεν επιβιώνουν μετά την κλείσιμο του shell
Εάν κλείσετε το τερματικό, όλες οι παγιευμένες εργασίες ή οι εργασίες στο φόντο καταστρέφονται. Για να παραμείνει ενεργή μια διαδικασία, χρησιμοποιήστε`nohup`+disown(Empty output)
$ 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 — Το tip που αλλάζει τα πάντα"
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 "Χωρίς απώλεια πλαισίου (context)" as a1
card "Χωρίς επανεκκίνηση" as a2
card "Ένα τερματικό αρκεί" as a3
}
problem -right-> solution : "Η εγγενής λύση\nUnix εδώ και 40 χρόνια"
solution -right-> advantages : "Αποτέλεσμα"
note bottom of advantages
το fg δεν είναι ένα άγνωστο tip
Είναι ένας θεμελιώδης μηχανισμός
του Unix shell
end note
@enduml
Γιατί το fg είναι υποτιμημένο;
Οι περισσότεροι σύγχρονοι προγραμματιστές ανακαλύπτουν`fg`αργά, ή ακόμα ποτέ. Μερικοί λόγοι :
-
Τα IDE κρύβουν το τερματικό: Η VS Code προσφέρει ένα ενσωματωμένο τερματικό, αλλά οι πολλαπλές καρτέλες κάνουν`fg`λιγότερο απαραίτητο φαινομενικά
-
Τα γραφικά εργαλεία αντικαθιστούν τις CLI: οι διαχειριστες αρχειων,οι επιτηρητες του συστημα,οι πελατες Git γραφικοι
-
tmux και screenαυτοί οι μúltiplexers λύνουν το ίδιο πρόβλημα διαφορετικά, αλλά`fg`είναι πιο απλό και πάντα διαθέσιμο
Ω</tool_call>,`fg`είναι :
-
διαπαντός: παρών σε όλα τα shells POSIX (bash, zsh, fish…)
-
Χωρίς εξάρτηση: δεν χρειάζεται να εγκαταστήσετε tmux ή screen
-
Στιγμιαίος: δύο χτυπήματα (`Ctrl+Z`тогда? Wait Greek: "τότε". So space + "τότε". So output: " τότε". Ensure no extra trailing spaces.
@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
τότε`fg`) για να παύσει και να συνεχίσει
-
Διατηρητής του συγκειμένου: η κατάσταση της διαδικασίας είναι ακέραια
@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultFontName sans-serif
rectangle "Γιατί το fg είναι\nυποτιμημένο;" as why #LightCoral {
card "IDE με τερματικό\nπολλαπλά καρτέλες" as w1
card "Γραφικά εργαλεία\nπου antithetical..." 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
Μνημονική τεχνική: τα σήματα
@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 : Η διαδικασία συνεχίζεται\nσε προβάδες user -> shell : bg shell -> proc : SIGCONT (signal 19) note right of proc : Η διαδικασία συνεχίζεται\nστο φόντο user -> shell : Ctrl+C shell -> proc : SIGINT (signal 2) note right of proc : Η διαδικασία ολοκληρώθηκε\nκατάσταση χαμένη @enduml
| Σήμα | Όνομα | Απεσταλμένο από | Εφέ |
|---|---|---|---|
2 |
|
|
Διακοπή — τελειώνει τη διαδικασία |
3 |
|
|
Έξοδος με core dump |
18 |
|
|
Διαλογική παύση — διακόπτει τη διαδικασία |
19 |
|
|
Συνεχίζει — αναλαμβάνει μια διαδικασία που είναι suspense |
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 : Processus figé\nen mémoire user -> shell : fg shell -> proc : SIGCONT (signal 19) note right of proc : Processus reprend\nen avant-plan user -> shell : bg shell -> proc : SIGCONT (signal 19) note right of proc : Processus reprend\nen arrière-plan user -> shell : Ctrl+C shell -> proc : SIGINT (signal 2) note right of proc : Processus terminé\nétat perdu @enduml
Συμπέρασμα
`fg`δεν είναι ένα άγνωστο tip — είναι ένας θεμελιώδης μηχανισμός του Unix shell, διαθέσιμο από τα έτη του '70. Το γεγονός ότι η πλειοψηφία των προγραμματιστών αγνοούν αυτό είναι ένα σύμπτωμα της εποχής μας: τα IDE και τα multiplexers μας έχουν απομακρύνει από τις βάσεις.
Αλλά όταν είστε σε έναν διακομιστή SSH, σε ένα ελάχιστο τερματικό, ή απλώς χρησιμοποιείτε`opencode`και ότι το LLM είναι πλήρως απασχολημένο —Ctrl+Z, fg, bg, `jobs`Είναι οι καλύτεροι φίλοι σας.