Comandi in Background

31 marzo 2018

Nozioni Chiave

Prima di affrontare il concetto di background sarà utile comprendere un aspetto fondamentale dei sistemi operativi. In origine le macchine di calcolo erano in grado di eseguire solo un elemento di algoritmo per passo, quindi una istruzione atomica per ogni unità di tempo. In pratica una operazione “esauriva” tutte le risorse di calcolo e queste potevano essere utilizzate nuovamente solo quando le stesse non erano più in uso. Ciò faceva procedere l’algoritmo a step, passo dopo passo, in maniera lineare. Potete immaginare il tutto come una sorta di ricetta in cui non leggete mai la frase “nel frattempo”. Il punto è proprio questo: non era possibile tagliare le patate a fette e nel frattempo riscaldare l’olio per friggerle perché due azioni contemporanee non potevano essere affrontate. Il problema risiedeva nella scarsezza di risorse computazionali ma anche nell’approccio alla programmazione rigidamente procedurale. Una delle prime strategie utilizzate per mitigare gli effetti di un vincolo tanto stringente fu quella di gestire risorse computazionali condivise in maniera più efficiente tramite “code” che ne regolavano l’utilizzo, ovvero adoperando metodologie di utilizzo non esclusivo delle risorse comuni in cui a disciplinare il tutto erano regole precise per decidere chi può utilizzare una risorsa ma anche come, quando e per quanto tempo. Le richieste sono quindi ordinatamente accodate, se non soddisfano i requisiti per un accesso immediato, al fine di valutarle nuovamente in un secondo momento. Tenteremo di esplicitare la questione con un esempio che introduce un livello di semplificazione forse eccessivo ma funzionale alla comprensione del concetto generale. State adoperando un browser web, il browser ha quindi appena visualizzato per voi questo testo. Non farà nulla di nuovo sino a quando non lo stimolerete tramite mouse, tastiera o touch screen. Bene, immaginate di avere un solo core di calcolo, situazione che sarebbe singolare per lo hardware attuale ma piuttosto comune sino a qualche anno fa. Mentre il browser è in attesa che qualcosa accada le risorse inutilizzate possono essere sfruttate per consentire a quel core di fare altro, a esempio indicizzare i cambiamenti che sono avvenuti nel vostro filesystem per consentire ricerche locali più veloci. I due processi utilizzano cioè le stesse risorse in maniera concorrente. Vale a dire un po’ per uno. Prendete uno scenario come questo, moltiplicatelo per l’architettura multicore coniugata a software in larga parte concepiti per sfruttare l’approccio multithread/multitask e avrete qualcosa che può ricordare una gara di staffetta in cui un certo numero di atleti si passano il testimone agendo contemporaneamente. E’ la situazione più comune su una macchina che ospita un Sistema Operativo di ultima generazione. Un’idea di quello che è stato appena accennato potrete ottenerla generando alcuni di processi da lasciare in esecuzione. Fatto ciò osservate l’output del comando top per qualche secondo in un terminale.

fprincipe@html1:~$ top

top - 10:20:21 up 41 min,  3 users,  load average: 1.18, 0.48, 0.18
Tasks:  91 total,   5 running,  86 sleeping,   0 stopped,   0 zombi
[...]

Ciò vi farà comprendere che quanto in esecuzione non necessariamente è sempre “in vista” o “attivo”. Anzi, semmai è vero il contrario. Quasi tutto quello che il vostro sistema operativo sta eseguendo è sotterraneo, nascosto. Quel regno di norma celato allo sguardo dell’utente è comunemente definito background. Tutti questi concetti sono utili nella comprensione di come strutturare una serie di comandi in uno script.

Comandi e operatori per il Background

Volete ottenere nuovamente il controllo della tastiera dopo aver lanciato un comando che potrebbe bloccarla come, a esempio, la compressione di una directory ingombrante? Non c’è alcun motivo per non lasciar svolgere questa operazione in background. E’ estremamente semplice, occorre banalmente accodare il carattere “&” a un comando e questo sarà inviato in background. La stessa cosa accadrà interrompendo l’output di un comando tramite la pressione contemporanea dei tasti Ctrl e Z. Così facendo richiedete uno stop momentaneo per il processo. In pratica ne avete interrotto l’esecuzione in maniera non definitiva congelandolo in uno stato da cui potrà continuare. Il numero fra parentesi che ricevete in risposta è importante perché associato al comando fg consente di far riemergere il processo riportandolo a uno stato di esecuzione convenzionale. Lo stesso numero, associato al comando bg, farà ripartire il processo accodando però al comando di esecuzione un carattere “&” che quindi lo farà girare in background (come avete già visto) separandolo dal controllo della tastiera che opera sul terminale al momento in uso. Andiamo oltre. Una serie di comandi può essere lanciata da linea di comando in un unico colpo se questi sono intervallati da “;”.

Ora avete nelle vostre mani quanto necessario per simulare il comportamento di un semplice script senza implementarlo effettivamente. Ovviamente uno script potrà essere assai più complesso, strutturato e con salti condizionali ma la sua essenza poggerà comunque su questi concetti fondamentali. Prima di lasciarvi con qualche esempio pratico consigliamo di fare un po’ di esperienza adoperando questi strumenti. Dalla prossima lezione entreremo concretamente nell’universo degli Script Linux.

fprincipe@html1:~$ ./infiniteloopsh
0
.
1
.
2
.
3
.
4
.
^Z
[8]+  Stopped                 ./infiniteloopsh
fprincipe@html1:~$ fg 8
./infiniteloopsh
5
.
6
.
7
.
[...]

fprincipe@html1:~$ echo "1";echo "2";echo "3"
1
2
3

Tutte le lezioni

1 ... 9 10 11 ... 23

Se vuoi aggiornamenti su Comandi in Background inserisci la tua e-mail nel box qui sotto:
 
X
Se vuoi aggiornamenti su Comandi in Background

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento dei dati per attività di marketing