Πίνακας περιεχομένων
χρόνος ανάγνωσης : 10 minutes

Εκκινείτε`./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é

Το πλεονέκτημα είναι διπλό:

  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

Επαναλάβε το job n στο προσκήνιο

fg %2

bg

Επαναλαμβάνει την προεπιλεγμένη εργασία στο παρασκήνιο

bg ou bg %1

bg %n

Συνεχίστε την εργασία n στο παρασκήνιο

bg %2

jobs

Εμφάνισε τα jobs του τρέχοντος κελύφους

jobs -l(με PID)

kill %n

Τερματισέ τη εργασία 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(παραμένει στη μνήμη)\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
σύντομη/εντολή Σήμα Επίδραση Πίσω;

Ctrl+Z

SIGTSTP

Υποβάλε τη διαδικασία (καταγεμμένη, στη μνήμη)

Ναι :`fg` ou bg

Ctrl+C

SIGINT

Κτάνε τη διαδικασία (ολοκληρωμένη)

Όχι : διαδικασία καταστραμμένη

Ctrl+\

SIGQUIT

Στονέστε τη διαδικασία + core dump

Όχι: η διαδικασία έχει καταστραφεί

commande &

—

Εκκίνησε στο παρασκήνιο άμεσα

`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`αργά, ή ακόμα ποτέ. Μερικοί λόγοι :

  1. Τα IDE κρύβουν το τερματικό: Η VS Code προσφέρει ένα ενσωματωμένο τερματικό, αλλά οι πολλαπλές καρτέλες κάνουν`fg`λιγότερο απαραίτητο φαινομενικά

  2. Τα γραφικά εργαλεία αντικαθιστούν τις CLI: οι διαχειριστες αρχειων,οι επιτηρητες του συστημα,οι πελατες Git γραφικοι

  3. tmux και screenαυτοί οι μúltiplexers λύνουν το ίδιο πρόβλημα διαφορετικά, αλλά`fg`είναι πιο απλό και πάντα διαθέσιμο

Ω</tool_call>,`fg`είναι :

  1. διαπαντός: παρών σε όλα τα shells POSIX (bash, zsh, fish…​)

  2. Χωρίς εξάρτηση: δεν χρειάζεται να εγκαταστήσετε tmux ή screen

  3. Στιγμιαίος: δύο χτυπήματα (`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`) για να παύσει και να συνεχίσει

  1. Διατηρητής του συγκειμένου: η κατάσταση της διαδικασίας είναι ακέραια

@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

SIGINT

Ctrl+C

Διακοπή — τελειώνει τη διαδικασία

3

SIGQUIT

Ctrl+\

Έξοδος με core dump

18

SIGTSTP

Ctrl+Z

Διαλογική παύση — διακόπτει τη διαδικασία

19

SIGCONT

fg/bg

Συνεχίζει — αναλαμβάνει μια διαδικασία που είναι suspense

15

SIGTERM

kill %n

Καθαρή λήξη

9

SIGKILL

kill -9 %n

αναγκαστική διακοπή (αδύνατο να διακοπεί)

Το πλήρες ρεύμα :

@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`Είναι οι καλύτεροι φίλοι σας.

Σχετικά άρθρα