Esecuzione in background di un comando (&)

In Bash, il simbolo & (ampersand) messo alla fine di un comando serve per eseguire il comando in background. Questo permette di continuare a usare il terminale mentre il comando è ancora in esecuzione.

Ad esempio possiamo eseguire in background il comando sleep in questo modo:

sleep 10 &

Output:

  • Subito viene scritto: [1] 22035
  • Dopo 10 secondi: [1] + 22035 done sleep 10
ParteSignificato
[1]Sempre il job number
+Indica che è l’ultimo job gestito (job “corrente”)
22035Il PID del processo
doneStato finale: il processo è terminato con successo
sleep 10Il comando eseguito

Pipe

Il simbolo | (pipe) serve per reindirizzare l’output di un comando verso l’input di un altro.

In pratica:

comando1 | comando2
  • L’output standard (stdout) di comando1 diventa l’input standard (stdin) di comando2.

Viene creato un solo job dove i comandi sono eseguiti contemporaneamente (in parallelo), e la pipe gestisce il flusso di dati tra di loro.

Comandi

jobs

Il comando jobs elenca i job attivi nella shell corrente.

jobs [-l] [-p]
  • senza niente: mostra il job number, lo stato e il comando dei processi
  • -l: aggiunge anche PID
  • -p: mostra soltanto i PID
sleep 60 &    # Avvia in background
 
jobs
[1]+  Running                 sleep 60 &
 
jobs -l
[1]+  12345 Running           sleep 60 &
 
jobs -p
12345

bg e fg

  • fg porta un processo in foreground (bloccando il terminale finché non termina).
  • bg riprende un processo sospeso e lo manda in background.
ComandoDescrizione
fgPorta in foreground il job corrente (+)
fg %nPorta in foreground il job con ID n
bgRiprende in background il job corrente
bg %nRiprende in background il job con ID n

I job possono essere identificati anche con:

  • %prefix: parte iniziale del comando del job (es. %slee per sleep)

  • %% oppure %+: l’ultimo job usato (corrente)

  • %-: il penultimo job usato

bg funziona solo con job sospesi

Se provi a usare bg su un job già in esecuzione, non succede nulla, fg invece può riportare in primo piano sia job sospesi che attivi in background.

ps

Il comando ps mostra informazioni sui processi attivi. Di default, ps mostra solo i processi associati al terminale corrente. Per vedere più processi, servono opzioni aggiuntive.

ps [-e] [-u] [p]
ComandoDescrizione
ps -eTutti i processi in esecuzione su tutte le shell o avviati a boot (figli del processo 0)
ps -u utenteMostra i processi di un determinato utente
ps -p PIDMostra informazioni sul processo con PID
ps -o {field, ...}per scegliere i campi da visualizzare

Significarono campi in output:

  • S: stato del processo (R, S, Z, T, t, D)
  • UID: ID dell’utente che ha lanciato il processo (se presente SetUID potrebbe non essere chi ha eseguito il comando)
  • PID: ID del processo
  • PPID: pid del processo che a creato questo processo (parent pid)
  • C: percentile di utilizzo della CPU (parte intera)
  • STIME: orario di avvio del processo
  • PRI: attuale priorità del processo (più è alto più la priorità è bassa)
  • NI: valore nice (da aggiungere alla priorità)
  • ADDR: indirizzo di memoria del processo (sempre vuoto, non mostrato più)
  • SZ: dimensione attuale del processo in numero di pagine
  • WCHAN: se il processo è in attesa di un qualche segnale o in sleep, qui c’è la funzione del kernel all’ interno del quale si è fermato.
  • TTY: terminale associato
  • TIME: tempo CPU usato finora
  • CMD: comando avviato
  • F: è una flag associata al processo:
    • 1 il processo è stato forkato, ma ancora non eseguito
    • 4 ha usato privilegi da super utente
    • 5: entrambe 1 e 4 (5 = 1 + 4)
    • 0: nessuno dei precedenti

top

top è un comando interattivo che mostra in tempo reale l’elenco dei processi in esecuzione, l’uso di CPU, RAM, uptime, e molto altro

Può essere visto come un ps ma interattivo e in tempo reale.

top [-b] [-n num] [-p {pid, ...}]
  • -b: non accetta più comandi intentavi , ma continua a fare refresh delle informazioni
  • -n num fa solo num refresh
  • -p {pid, ...} mostra informazioni dei processi con pid nella lista {pid, ...}

kill

Il comando kill non uccide sempre: invia un segnale (di default SIGTERM) a uno o più processi. A seconda del segnale, può:

  • terminare
  • sospendere
  • riavviare
  • lasciare intatto un processo
ComandoDescrizione
kill -lElenca tutti i segnali disponibili
kill PIDInvia SIGTERM al processo con PID indicato
kill -signal PIDInvia il segnale specificato attraverso l’identificatori signal al processo

Un può essere identificato in 3 modi:

  • attraverso il suo nome (es: STOP)
  • attraverso SIG + il suono nome (es: SIGSTOP)
  • attraverso il suo identificatore numerico (es: per STOP è 19)

Alcuni segnali utili sono (per lista completa utilizzare kill -l):

  • SIGSTOP (19) che sospendo il processo (utilizzato da CTRL+z)
  • SIGINT(2) e SIGKILL (9) che interrompono il processo (utilizzato da CTRL+c)
  • SIGCONT per la continuazione dei processi sospesi (utilizzato dal comando bg)

È possibile utilizzare la notazione con % (usata anche in bg e fg) per gestire direttamente i processi in esecuzione sulla shell.

SIGUSR1 e SIGUSR2

I segnali SIGUSR1 e SIGUSR2 sono impostati per essere usati dall’utente per le proprie necessità.

Essi consentono una semplice forma di comunicazione tra processi

Esempio: un programma P1 può definire un gestore del segnale (signal handler) per SIGUSR1. Se un programma P2 invia un SIGUSR1 a P1, allora P1 eseguirà il codice del gestore del segnale.

nice & renice

I comandi nice e renice controllano la priorità relativa dei processi, influenzando quanto tempo CPU ricevono rispetto agli altri.

nota: Più alto è il valore di niceness, meno priorità ha il processo (è più “gentile” con gli altri processi).

nice [-n num] [comando]
renice num {pid, ...}
ComandoDescrizione
nice comandoAvvia un comando con priorità di default (10)
nice -n num comandoAvvia con niceness N (range: -20 = alta priorità, 19 = bassa)
renice num PIDCambia la niceness di un processo già attivo
renice num -u utenteCambia la niceness a tutti i processi di un utente

⚠️ Solo root può impostare un valore più basso di quello attuale (cioè aumentare la priorità).

strace

strace traccia le chiamate di sistema (come read(), write(), open(), execve(), ecc.) fatte da un processo.

È molto utile per:

  • debug di programmi che non funzionano,
  • capire cosa fa un binario,
  • trovare file mancanti, permessi negati, ecc.
ComandoDescrizione
strace comandoEsegue il comando tracciandone le syscall
strace -p PIDAttacca strace a un processo già in esecuzione
strace -o file.log comandoSalva l’output in un file invece che a schermo