Controllo Job e Processi
Processi in Background
Il comando, per esempio:
sleep 2000 &
[1] 7145
$
- manda il processo in background
- ritorna subito il pronto
Nell'esempio indicato il simbolo $ denota il pronto, e non è da digitare.
I due numeri tornati nel rapporto sono:
- JID - Job ID - tra parentesi quadre
- PID - Process ID - dopo le quadre
Il PID è globale di sistema, il JID è locale di terminale. Processi in background lanciati su terminali diversi producono la stessa sequenza di JID.
Attenzione perchè il processo continua a leggere e scrivere su terminale, se ne ha bisogno. L'esempio sopra è didattico, in un caso vero bisogna anche preoccuparsi delle eventuali redirezioni di input, output ed errori, prima di lanciare un processo in background.
Fermare i processi
Se improvvisamente dovessimo terminare una partita a scacchi interattiva su un terminale, perchè è sorto un problema urgente che richiede il terminale, ci dispiacerebbe battere Ctrl-C, specie se stavamo vincendo noi.
Si può battere Ctrl-Z, che invia al processo il segnale di 'sospensione' (susp - controllare con stty -a). Questo lo pone nello sato particolare 'Stopped', da cui può poi essere fatto ripartire.
Job Control
Vi possono essere più job in stato Stopped, così come più jobs in Background. Il modo interattivo si chiama ora Foreground.

Un ulteriore stato detto Terminated indica i job terminati.
Per listare tutti job sospesi o in background:
jobs
Nel rapporto il simbolo + indica il job di default e il - il prossimo. Il numero associato n è il JID.
Comandi:
fg %n- porta in Foreground il job n, da Background o Stoppedfg- porta in foreground il job di default
bg %n- porta in Bachground il job n, da Stoppedkill %n- porta a Terminated il job n, da Background o Stopped
Il diagramma a stati indicato si chiama Job Control ed è un servizio offerto dalla shell, non dal sistema (la shell originale, di Bourne, non ce l'ha).
E' disponibile anche il settaggio di terminale tostop (Terminal Output Stop). Dare il comando:
stty tostop
fa sì che quando un processo in background tenta di scrivere a terminale, il processo viene portato d'ufficio in modalità Stopped.
Il contrario è: stty -tostop.
Esempio
$ sleep 2000 &
[1] 27402
$ sleep 3000 &
[2] 27406
$ sleep 4000 &
[3] 27407
$ sleep 5000
^Z
[4]+ Stopped sleep 5000
$ jobs
[1] Running sleep 2000 &
[2] Running sleep 3000 &
[3]- Running sleep 4000 &
[4]+ Stopped sleep 5000
$ ps w
PID TTY STAT TIME COMMAND
27384 pts/1 Ss 0:00 bash
27402 pts/1 S 0:00 sleep 2000
27406 pts/1 S 0:00 sleep 3000
27407 pts/1 S 0:00 sleep 4000
27408 pts/1 T 0:00 sleep 5000
27411 pts/1 R+ 0:00 ps w
$ kill %1
$
[1] Terminated sleep 2000
$ kill 27406
$
[2] Terminated sleep 3000
$ kill -9 27408
[4]+ Killed sleep 5000
$
Nell'esempio:
- Vengono lanciati tre job in background
- Viene lanciato un job in forground
- Il job in foreground viene interrotto con
Ctrl-Z - Vengono listati i jobs col comando
jobs - Vengono listati i processi col comando
ps w(largo) - Viene terminato un job tramite Job Control
- Viene terminato un processo tramite
kill PID- Notare che in entrambi i casi occorre battere Invio una seconda volta prima che la shell dia il rapporto di terminazione
- Viene terminato un processo tramite
kill -9 PID- Notare che il rapporto arriva subito, ed è Killed, non più Terminated (non era un eufemismo, ma un termine tecnico preciso)