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)