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.

Job Control

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 Stopped
    • fg - porta in foreground il job di default
  • bg %n - porta in Bachground il job n, da Stopped
  • kill %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)

results matching ""

    No results matching ""