diff options
author | Elena of Valhalla'' Grandi <valhalla@trueelena.org> | 2014-02-25 22:39:40 +0100 |
---|---|---|
committer | Elena of Valhalla'' Grandi <valhalla@trueelena.org> | 2014-02-25 22:39:40 +0100 |
commit | 2d9a1fc624c9884ed97db725db35b81a42fd84df (patch) | |
tree | 4ba3f9227f32804010dac138baa416f6a3d32974 /src | |
parent | 8c01cef7a47c011852b5327f2f2d48ae30be881e (diff) |
Riga di comando: materiale sesta serat
Diffstat (limited to 'src')
-rw-r--r-- | src/corsi/2014-linea_di_comando.txt | 25 | ||||
-rw-r--r-- | src/corsi/2014-linea_di_comando/index.txt | 2 | ||||
-rw-r--r-- | src/corsi/2014-linea_di_comando/log-lezione_6-raw.log | 191 | ||||
-rw-r--r-- | src/corsi/2014-linea_di_comando/log-lezione_6.log | 175 |
4 files changed, 386 insertions, 7 deletions
diff --git a/src/corsi/2014-linea_di_comando.txt b/src/corsi/2014-linea_di_comando.txt index 8edb033..53826ff 100644 --- a/src/corsi/2014-linea_di_comando.txt +++ b/src/corsi/2014-linea_di_comando.txt @@ -1,6 +1,6 @@ .. restindex - include: no + include: yes page-description: /description tags: @@ -20,16 +20,15 @@ Linea di Comando .. contents:: L'edizione 2014 del corso sull'uso di GNU/Linux da riga di comando -si terrà al martedì sera dalle 21:00 alle 22:00 a partire dal 21 gennaio -per almeno 6 incontri. +si è tenutaal martedì sera dalle 21:00 alle 22:00 a partire dal 21 gennaio +per 6 incontri. Per favorire la partecipazione anche di chi ha problemi a raggiungerci, -il corso si terrà via IRC_, sul canale #lifo, network freenode, leggibile +il corso si è tenuto via IRC_, sul canale #lifo, network freenode, leggibile sia tramite client (xchat, irssi...) che su webchat_. -Le registrazioni sono chiuse; per chi non fosse riuscito ad iscriversi -o non riuscisse a partecipare verrà riportato materiale e log -della serata su questa pagina. +Materiale e log delle serate sono riportate su questa pagina +per chi non fosse riuscito ad iscriversi o a partecipare. .. _IRC: ../laboratorio/contatti.html#canale-irc .. _webchat: http://webchat.freenode.net/?channels=lifo @@ -70,6 +69,7 @@ grazie alla documentazione sia preinstallata (manpages) che online. ~~~~~~~~~~ * file e directory: creazione e manipolazione + * `log della lezione 2 <2014-linea_di_comando/log-lezione_2.log>`_ * `materiale della lezione 2 <2014-linea_di_comando/riga_di_comando-lezione_2.tar.xz>`_ @@ -77,6 +77,7 @@ grazie alla documentazione sia preinstallata (manpages) che online. ~~~~~~~~~~ * Pipe e redirezioni + * `log della lezione 3 <2014-linea_di_comando/log-lezione_3.log>`_ * `materiale della lezione 3 <2014-linea_di_comando/riga_di_comando-lezione_3.tar.xz>`_ @@ -85,6 +86,7 @@ grazie alla documentazione sia preinstallata (manpages) che online. * Variabili * Valori di uscita + * `log della lezione 4 <2014-linea_di_comando/log-lezione_4.log>`_ * `materiale della lezione 4 <2014-linea_di_comando/riga_di_comando-lezione_4.tar.xz>`_ @@ -93,6 +95,7 @@ grazie alla documentazione sia preinstallata (manpages) che online. * Globbing * Espressioni regolari + * `log della lezione 5 <2014-linea_di_comando/log-lezione_5.log>`_ * `materiale della lezione 5 <2014-linea_di_comando/riga_di_comando-lezione_5.tar.xz>`_ @@ -101,6 +104,14 @@ grazie alla documentazione sia preinstallata (manpages) che online. * Controllo dei processi +* `log della lezione 6 <2014-linea_di_comando/log-lezione_6.log>`_ +* `materiale della lezione 6 <2014-linea_di_comando/riga_di_comando-lezione_6.tar.xz>`_ + +3 marzo +~~~~~~~ + +* Serata per domande e risposte su tutti gli argomenti del corso + .. vim: set filetype=rst sw=3: diff --git a/src/corsi/2014-linea_di_comando/index.txt b/src/corsi/2014-linea_di_comando/index.txt index 56f601d..5302d92 100644 --- a/src/corsi/2014-linea_di_comando/index.txt +++ b/src/corsi/2014-linea_di_comando/index.txt @@ -20,6 +20,8 @@ file: log-lezione_5.log file: log-lezione_5-raw.log file: riga_di_comando-lezione_6.tar.xz + file: log-lezione_6.log + file: log-lezione_6-raw.log /restindex uservalues diff --git a/src/corsi/2014-linea_di_comando/log-lezione_6-raw.log b/src/corsi/2014-linea_di_comando/log-lezione_6-raw.log new file mode 100644 index 0000000..76ccde8 --- /dev/null +++ b/src/corsi/2014-linea_di_comando/log-lezione_6-raw.log @@ -0,0 +1,191 @@ +21:04 <@valhalla> e iniziamo come al solito scaricando il materiale: +21:04 <@valhalla> wget http://www.lifolab.org/corsi/2014-linea_di_comando/riga_di_comando-lezione_6.tar.xz +21:04 <@valhalla> tar -x -v -f riga_di_comando-lezione_6.tar.xz +21:05 <@valhalla> questa sera parliamo di controllo dei processi +21:05 <@valhalla> (dimenticavo all'inizio il solito cd $DIRECTORY_SOLITA +21:06 <@valhalla> e dopo aver scaricato e scompattato prepariamo come sempre lo spazio per fare esercizi: ``cd lezione_6 && mkdir esercizi`` +21:06 -!- pigro [~Luca@87.18.59.215] has joined #lifo +21:06 <@valhalla> (che come ricordate dalla volta scorsa, vi fa creare la directory esercizi solo se siete riusciti ad entrare nella dir lezione_6) +21:06 <@valhalla> e poi ``cd esercizi`` +21:06 -!- taumaturgo [5d93b0b8@gateway/web/freenode/ip.93.147.176.184] has joined #lifo +21:07 -!- JulesX [~lorenzo@adsl-ull-106-115.51-151.net24.it] has joined #lifo +21:07 <@valhalla> la maggior parte dei comandi che abbiamo visto le altre volte finiva subito, quindi veniva lanciata, si aspettava la fine e poi si lanciava il comando successivo +21:07 <@valhalla> per`o ovviamente non tutti i programmi sono così +21:08 -!- fiera [~fiera@87.13.255.234] has joined #lifo +21:08 <@valhalla> alcuni stanno attivi a lungo perché elaborano dati, altri lanciano un'interfaccia grafica e stanno attivi finché non sono stati chiusi, ad esempio +21:08 <@valhalla> per fare gli esempi, invece, stasera usiamo un comodo comando che se ne sta fermo ad aspettare per un tot di secondi: sleep +21:09 <@valhalla> ad esempio, ``sleep 5`` si ferma per 5 secondi e poi finisce +21:09 <@valhalla> normalmente questo blocca la shell che state usando: questo perché il comando è in "foreground" +21:10 <@valhalla> ovvero, mentre gira quello è lui a prendersi l'input su stdin +21:10 <@valhalla> e in ogni momento in una shell può esserci solo un comando in foreground +21:11 <@valhalla> ci possono però essere più comandi in "background", che non hanno modo di ottenere input, ma continuano a girare fino a che non hanno finito lasciando la shell libera +21:11 -!- delfino1983 [~Alex83@host155-139-dynamic.252-95-r.retail.telecomitalia.it] has joined #lifo +21:11 -!- delfino1983 [~Alex83@host155-139-dynamic.252-95-r.retail.telecomitalia.it] has quit [Changing host] +21:11 -!- delfino1983 [~Alex83@unaffiliated/delfino1983] has joined #lifo +21:12 <@valhalla> un modo per mandare un programma in background è mettere & alla fine del comando (cosa che avevamo visto alla prima lezione, e vi avevo promesso spiegazione) +21:12 <@valhalla> ad esempio, possiamo dare il comando ``sleep 100 &`` e subito dopo vediamo che la shell è libera, e ad esempio possiamo usare il comando ``jobs`` per vedere che programmi stanno girando in quella shell +21:13 <@valhalla> vediamo che il nostro sleep 100 è in status Running, ma noi abbiamo la shell a disposizione +21:14 <@valhalla> vedo che ci sono domande, passatemele pure +21:15 <@diego71> < pigro> il numero visualizzato da jobs ?? il pid del job? +21:15 <@valhalla> no, è il numero di job in quella shell +21:15 <@valhalla> di PID invece parliamo dopo, e vediamo come si fa a vederlo +21:17 <@valhalla> nel frattempo, sleep dovrebbe aver finito, e se lanciamo ancora ``jobs`` vediamo che viene segnato come "Done" +21:17 <@valhalla> e poi sparisce del tutto +21:18 <@valhalla> adesso per comodità facciamo andare due comandi alla volta: mettendo una serie di comandi tra parentesi tonde si fa partire una nuove shell che esegue quei programmi, e poi possiamo mandare il tutto in background, ad esempio +21:18 <@valhalla> ``(sleep 60 ; date) &`` +21:18 <@valhalla> ancora ``jobs`` e vediamo che sta andando un job con tutti e due i comandi +21:18 <@valhalla> in questo modo, quando sleep ha finito vediamo stampare cose, e ci accorgiamo subito che ha finito +21:19 <@valhalla> mentre un programma è in foreground, possiamo passargli dei segnali +21:19 <@valhalla> che i programmi per unix riconoscono e agiscono di conseguenza +21:21 <@valhalla> con Ctrl-C si passa il segnale SIGINT, che interrompe il programma +21:21 <@valhalla> i programmi poi possono intercettare questi segnali e non farsi interrompere subito, ma ad esempio chiudersi come si deve, ma dipende dal programma +21:21 <@valhalla> ad esempio, lanciamo ``(sleep 100 ; echo "sleep")``, poi premiamo Ctrl-C +21:22 <@valhalla> e con jobs possiamo controllare che non è rimasto niente, il processo è stato fermato +21:22 <@valhalla> domande fin qui? +21:23 <@valhalla> ok, proseguo +21:23 <@valhalla> un altro segnale utile è SIGSTOP, che invece interrompe il processo senza chiuderlo +21:23 <@valhalla> e poi lo si pu`o far riprendere +21:24 <@valhalla> come se lo si mettesse in pausa +21:24 <@valhalla> ad esempio ``(sleep 100 ; echo "sleep")`` poi premete Ctrl-Z +21:24 <@valhalla> e con ``jobs`` potete vedere che c'è quel processo che risulta "Stopped" +21:25 <@valhalla> finché lo lasciate lì non fa niente, non fa neanche passare i 100 secondi prima di chiudersi +21:25 -!- albertux [~Icedove@dynamic-adsl-78-14-226-4.clienti.tiscali.it] has joined #lifo +21:25 <@valhalla> però ci sono dei comandi coi quali si può far riprendere un processo; con ``fg`` gli si dice di tornare in foreground e ricominciare a funzionare +21:26 <@valhalla> oppure, (per provare potete reinterrompere con Ctrl-Z un'altra volta) +21:26 <@valhalla> con ``bg`` si manda il processo bloccato in background, e lo si fa riprendere +21:27 <@valhalla> questo è il modo in cui si mandano in background dei processi se si è dimenticato di mettere & alla fine del comando, ad esempio +21:27 <@valhalla> con ``jobs`` potete sempre vedere che avete un processo in background, e dopo un po' finalmente vi stamperà "sleep" +21:27 <@valhalla> domande? +21:28 <@diego71> < gioque> che differenza c'?? tra sleep 100; echo "sleep" e (sleep 100; echo sleep) +21:28 <@valhalla> se si scrive ``sleep 100; echo "sleep"`` i due comandi vengono lanciati in successione dalla shell in cui si sta lavorando +21:28 <@valhalla> con le parentesi invece viene aperta una nuova shell ed è lei a lanciare in successione i due comandi +21:28 <@valhalla> col vantaggio che li si pu`o trattare come una cosa unica +21:29 <@valhalla> nel nostro caso per mandarli in foreground/background, ma anche ad esempio per leggere lo stdout di tutti uno dopo l'altro +21:29 -!- albertux [~Icedove@dynamic-adsl-78-14-226-4.clienti.tiscali.it] has quit [Client Quit] +21:30 <@valhalla> se si scrivesse solo ``sleep 100; echo "sleep" &`` sarebbe solo l'echo ad essere messo in background, sleep rimarrebbe in foreground +21:30 <@valhalla> altre domande? +21:31 <@valhalla> proseguo +21:31 <@valhalla> un'altro modo che abbiamo di mandare segnali ai processi è il comando kill +21:33 <@valhalla> di default anche lui manda il segnale SIGINT, mentre con l'opzione ``-9`` manda il segnale SIGKILL, che non può essere intercettato dai programmi e li fa chiudere ad ogni costo +21:34 <@valhalla> ad esempio, possiamo lanciare un paio di comandi in background: ``(sleep 100 ; echo "primo") &`` e poi ``(sleep 100 ; echo "secondo") &`` +21:34 <@valhalla> ``jobs`` per vedere che ci sono +21:34 <@valhalla> e poi con ``kill %`` possiamo mandare il segnale SIGINT al secondo dei due +21:34 <@valhalla> e aspettando vedremo che solo il primo sarà arrivato a completamento +21:36 <@valhalla> (altre domande? +21:37 <@valhalla> < tiziano> cosa significa il carattere % in kill %? +21:37 <@valhalla> sta per "ultimo processo" +21:37 <@valhalla> lo si può usare anche con fg e bg +21:38 <@valhalla> oltre a % e basta si pu`o anche usare %<numero> e si lavora sul job con quel numero (come viene stampato dal comando jobs +21:39 <@valhalla> ad esempio, ``(sleep 100 ; echo "primo") &`` ``(sleep 100 ; echo "secondo") &`` e poi ``kill %1`` ucciderà il primo dei due, e lascerà andare il secondo +21:39 <@valhalla> altre domande? +21:39 <@valhalla> vado avanti +21:40 <@valhalla> un altro comando utile è ps, che stampa i processi in corso, e di default stampa non solo i processi della shell in corso, ma quelli del *terminale* +21:41 <@valhalla> ad esempio, mettiamoci un po' di roba con ``sleep 100 &`` ripetuto un paio di volte +21:41 <@valhalla> e poi ``ps`` +21:41 <@valhalla> di default quello mostra il PID del processo, che era stato citato prima +21:42 <@valhalla> ovvero, un identificativo univoco del processo su *tutto* il sistema +21:42 <@valhalla> [ditemi sul canale di là per favore se mi state leggendo] +21:42 -!- diego_ [~diego@81-174-50-202.v4.ngi.it] has joined #lifo +21:43 -!- diego_ [~diego@81-174-50-202.v4.ngi.it] has quit [Client Quit] +21:44 <@valhalla> dicevo, il PID non è univoco nel tempo: dopo un certo numero riparte a prendere i numeri rimasti liberi da processi che sono stati chiudi +21:44 <@valhalla> ma in ogni momento ci sarà un solo processo con quel PID +21:45 <@valhalla> usando l'opzione ``-f`` di ps si hanno un po' più di dettagli utili +21:46 <@valhalla> e in particolare UID, ovvero l'utente con i cui permessi sta girando quel processo e le opzioni con cui era stato lanciato il comando +21:47 <@valhalla> doamnde? +21:47 <@diego71> pigro> che differenza c'?? tra PID e PPID? +21:47 <@valhalla> PPID è il PID del processo padre del processo elencato +21:47 <@valhalla> ovvero del processo che ha fatto partire il processo in questione +21:48 <@valhalla> con questo possiamo anche vedere la differenza tra ``sleep 100 ; echo "uno"`` e ``(sleep 100 ; echo "due")`` +21:49 <@valhalla> ad esempio se facciamo ``sleep 100 ; echo "uno" +21:49 <@valhalla> `` +21:50 <@valhalla> poi ctrl-z per sospenderlo, e poi ps +21:50 <@valhalla> vediamo che ci sono una bash, sleep e il ps appena lanciato +21:51 <@valhalla> (poi usiamo fg per far tornare attivo lo sleep, o bg per mandarlo in background, cos`i va avanti +21:51 <@valhalla> se invece scriviamo ``(sleep 100 ; echo "due")``, poi sempre ctrl-z per fermarlo +21:52 <@valhalla> a quel punto con ``ps`` vediamo che ci sono due bash, uno sleep e poi ps +21:52 <@valhalla> e anzi, se usiamo ps -f vediamo che il parent della seconda bash e del ps è la prima bash +21:52 <@valhalla> mentre sleep ha come parent la seconda bash +21:52 <@valhalla> altre domande? +21:54 <@valhalla> ok, dovrei aver finito il backlog delle domande a cui avevo detto rispondo dopo +21:54 <@valhalla> se manca qualcosa, perfavore rifatela +21:54 <@valhalla> intanto vado avanti dicendo che: +21:54 <@valhalla> il PID pu`o essere usato anche come parametro di kill, per mandare segnali a processi non necessariamente sulla stessa shell +21:55 <@valhalla> ad esempio, diamo il solito ``sleep 100 &`` +21:55 -!- delfino1983 [~Alex83@unaffiliated/delfino1983] has quit [Quit: Sto andando via] +21:55 <@valhalla> vediamo che ci stampa il numero di job tra parentesi e dopo il suo pid +21:55 <@valhalla> possiamo controllare che lo sia con ps +21:55 <@valhalla> e poi possiamo ucciderlo con ``kill $PID`` +21:55 <@valhalla> dove ovviamente al posto di $PID metterete il numero visto prima +21:56 <@valhalla> per trovare il PID di processi che non conoscete si usa sempre ps +21:56 <@valhalla> con ``ps -e -f`` si vedono tutti i processi del sistema +21:56 <@valhalla> anzi, meglio ``ps -e -f | less`` :) +21:57 <@valhalla> oppure ``ps -e -f | grep $NOME_DEL_PROGRAMMA_CHE_VI_SI_E_PIANTATO`` :) +21:58 <@valhalla> oppure in qualche caso è utile ``-u $NOME_UTENTE`` al posto di ``-e`` per vedere solo i processi di qualche utente +21:58 <@valhalla> domande? +22:00 <@diego71> < pigro> se per errore invio il kill al PPID +22:00 <@valhalla> pigro: uccidi il PPID (e a catena di solito anche tutti i suoi figli) +22:01 <@valhalla> a meno che si cerchi di killare un processo di qualche altro utente, nel qual caso lo si può fare solo se si è root +22:01 <@valhalla> altre domande +22:01 -!- DD3my [~DD3my@unaffiliated/dd3my] has quit [Quit: Sto andando via] +22:01 <@diego71> < gioque> per mettere in pause (tipo ctrl+z) un processo che non sia l'ultimo? (tipo se ho tre jobs e volgio mettere in stato stopped [non killed] il n 2 come faccio?) +22:01 -!- popi [4f06ae61@gateway/web/freenode/ip.79.6.174.97] has joined #lifo +22:02 <@valhalla> porti in foreground il processo che vuoi stoppare con ``fg %2`` (ad esempio), e poi usi ctrl-z +22:02 <@valhalla> altre domande? +22:03 <@diego71> < polva> valhalla, c'era quella domanda su come distinguere tra shell e processo +22:03 <@valhalla> in che senso distinguere tra shell e processo? +22:04 <@diego71> < polva> riposto: ! valhalla ha detto che usare le parentesi fa avviare una nuova shell. a me si avvia sempre nella stessa. parte solo un altro comando +22:04 <@valhalla> avevamo visto l'esempio prima che con ps faceva vedere che tra i processi attivi c'era una nuova bash +22:05 <@valhalla> dalle 21:49 in poi nel log +22:05 <@valhalla> non si apre un nuovo *terminale*, solo una nuova bash all'interno nello stesso terminale, se era questo il tuo dubbio +22:05 <@valhalla> altre domande? +22:07 <@diego71> < tiziano> che segnale viene emesso esattamente con ctrl-z? +22:07 <@valhalla> SIGSTOP +22:08 <@valhalla> ultimo comando per la serata, il comando ``top`` +22:08 <@valhalla> vi fa vedere i processi attivi in ordine di risorse usate, e aggiornandosi in tempo reale +22:09 <@valhalla> di default ordina per chi sta usando più CPU +22:09 <@valhalla> per i dettagli del significato dei vari campi pagina di manuale, che sennò ci vorrebbe una lezione intera +22:09 <@valhalla> ma se avete il computer piantato, è probabile che il colpevole sia uno dei primi nomi che saltano fuori :) +22:10 <@valhalla> e adesso possiamo proseguire con le domande rimaste +22:10 <@valhalla> (ah, poi q per uscire da top) +22:11 <@diego71> < pigro> a me prima non mi faceva il kill di un processo che era stoppato +22:11 <@valhalla> questo perché SIGINT è un segnale che il processo può elaborare +22:11 <@valhalla> di default quello che fa è uscire subito +22:11 <@valhalla> ma potrebbe anche fare qualcosa prima +22:12 <@valhalla> e se è stoppato, non pu`o neanche fare l'elaborazione "ah, un SIGSTOP, allora esco" +22:12 <@valhalla> ehm, SIGINT, non SIGSTOP +22:12 <@valhalla> sorry +22:12 <@valhalla> (nell'ultima riga) +22:12 <@valhalla> altre domande? +22:13 <@valhalla> < MrPan> htop è una versione "potenziata" del comando top ? +22:13 <@valhalla> pi`u o meno sì, nel senso che è un programma che fa cose simili +22:13 -!- DD3my [~DD3my@unaffiliated/dd3my] has joined #lifo +22:14 <@valhalla> però top c'è di default nei sistemi, htop va eventualmente installato +22:14 <@valhalla> altre domande? +22:15 <@valhalla> < gioque> se io ho messo subito in pausa con ctrl+z un processo es (sleep 10; echo "test") e faccio fg di dopo 10 secondi mi scrive subito test, è normale o dovrebbe aspettarmi 10 secondi? +22:15 <@valhalla> no, dovrebbe aspettarti 10 secondi +22:16 <@valhalla> per`o quei 10 secondi comprendono il tempo impiegato a mettere in pausa il processo dopo averlo lanciato +22:16 <@valhalla> e quelli da quando fai fg fino a quando stampa +22:17 <@valhalla> uhm, per`o in effetti ho appena provato, esce subito +22:18 <@valhalla> <@diego71> gioque: probabilmente ricordavo male io, la sleep aspetta 10 secondi a prescindere da ^Z +22:19 <@valhalla> la pagina di manuale in effetti non lo dice +22:19 <@valhalla> (ed è anche vero che nella vita reale no `e che lo si usi in questo modo) +22:20 <@diego71> < stefano_> leggendo il man mi chiedevo cosa volesse dire: "<Left> force a screen redraw (if necessary)" +22:20 <@valhalla> significa che se si preme il tasto "freccia a sinistra" il programma top ridisegna lo schermo +22:21 <@valhalla> cosa che di solito fa ogni tot secondi, ma se premi lo fa nel momento in cui hai premuto +22:22 <@diego71> < erio> sleep 10 ; echo "OK". Poi ctrl Z e poi fg ...per?? non mi stampa "ok" +22:22 <@valhalla> in realtà te l'ha stampato quando hai fatto ctrl-z, perché non avendo le () attorno hai sospeso il primo processo (lo sleep) e quindi il secondo (l'echo) è partito +22:22 <@valhalla> altre domande? +22:23 -!- aldagaau [~Alain@host40-234-dynamic.50-79-r.retail.telecomitalia.it] has left #lifo [] +22:24 <@diego71> < polva> una domanda teorica. mi sfugge come mai sia necessario invocare un'altra bash per far fare due operazioni insieme. +22:24 <@diego71> ok, ti rispondo io +22:24 <@diego71> la comodita' e' che hai un solo processo figlio che fa tutti i comandi uno dopo l'altro +22:25 <@diego71> quindi se fai per esempio ^Z stoppi tutta la sequenza, invece che solo il primo come nel caso di erio +22:26 <@valhalla> e per poter raggruppare il tutto assieme ti serve un processo che abbia un numero, quindi si lancia un processo bash +22:27 <@valhalla> altre domande? +22:28 <@valhalla> allora, come gi`a detto all'inizio +22:28 <@valhalla> il corso con stasera è finito, nel materiale c'è un file approfondimenti.rst con link ad un paio di documenti utili +22:29 <@valhalla> in particolare, gli Appunti di Informatica Libera contengono fondamentalmente TUTTO :) +22:29 <@valhalla> mentre bash guide for beginners e poi advanced bash scripting guide sono utili per approfondire l'argomento shell +22:29 <@valhalla> settimana prossima faremo una serata dedicata a domande e risposte +22:30 <@valhalla> così se qualcuno ha qualche domanda arretrata che gli è venuta in mente tra una serata e l'altra può farla +22:32 <@valhalla> e detto questo, chiudo e mi metto a preparare i log diff --git a/src/corsi/2014-linea_di_comando/log-lezione_6.log b/src/corsi/2014-linea_di_comando/log-lezione_6.log new file mode 100644 index 0000000..be152e6 --- /dev/null +++ b/src/corsi/2014-linea_di_comando/log-lezione_6.log @@ -0,0 +1,175 @@ +21:04 <@valhalla> e iniziamo come al solito scaricando il materiale: +21:04 <@valhalla> wget http://www.lifolab.org/corsi/2014-linea_di_comando/riga_di_comando-lezione_6.tar.xz +21:04 <@valhalla> tar -x -v -f riga_di_comando-lezione_6.tar.xz +21:05 <@valhalla> questa sera parliamo di controllo dei processi +21:05 <@valhalla> (dimenticavo all'inizio il solito cd $DIRECTORY_SOLITA +21:06 <@valhalla> e dopo aver scaricato e scompattato prepariamo come sempre lo spazio per fare esercizi: ``cd lezione_6 && mkdir esercizi`` +21:06 <@valhalla> (che come ricordate dalla volta scorsa, vi fa creare la directory esercizi solo se siete riusciti ad entrare nella dir lezione_6) +21:06 <@valhalla> e poi ``cd esercizi`` +21:07 <@valhalla> la maggior parte dei comandi che abbiamo visto le altre volte finiva subito, quindi veniva lanciata, si aspettava la fine e poi si lanciava il comando successivo +21:07 <@valhalla> per`o ovviamente non tutti i programmi sono così +21:08 <@valhalla> alcuni stanno attivi a lungo perché elaborano dati, altri lanciano un'interfaccia grafica e stanno attivi finché non sono stati chiusi, ad esempio +21:08 <@valhalla> per fare gli esempi, invece, stasera usiamo un comodo comando che se ne sta fermo ad aspettare per un tot di secondi: sleep +21:09 <@valhalla> ad esempio, ``sleep 5`` si ferma per 5 secondi e poi finisce +21:09 <@valhalla> normalmente questo blocca la shell che state usando: questo perché il comando è in "foreground" +21:10 <@valhalla> ovvero, mentre gira quello è lui a prendersi l'input su stdin +21:10 <@valhalla> e in ogni momento in una shell può esserci solo un comando in foreground +21:11 <@valhalla> ci possono però essere più comandi in "background", che non hanno modo di ottenere input, ma continuano a girare fino a che non hanno finito lasciando la shell libera +21:12 <@valhalla> un modo per mandare un programma in background è mettere & alla fine del comando (cosa che avevamo visto alla prima lezione, e vi avevo promesso spiegazione) +21:12 <@valhalla> ad esempio, possiamo dare il comando ``sleep 100 &`` e subito dopo vediamo che la shell è libera, e ad esempio possiamo usare il comando ``jobs`` per vedere che programmi stanno girando in quella shell +21:13 <@valhalla> vediamo che il nostro sleep 100 è in status Running, ma noi abbiamo la shell a disposizione +21:14 <@valhalla> vedo che ci sono domande, passatemele pure +21:15 <@diego71> < pigro> il numero visualizzato da jobs ?? il pid del job? +21:15 <@valhalla> no, è il numero di job in quella shell +21:15 <@valhalla> di PID invece parliamo dopo, e vediamo come si fa a vederlo +21:17 <@valhalla> nel frattempo, sleep dovrebbe aver finito, e se lanciamo ancora ``jobs`` vediamo che viene segnato come "Done" +21:17 <@valhalla> e poi sparisce del tutto +21:18 <@valhalla> adesso per comodità facciamo andare due comandi alla volta: mettendo una serie di comandi tra parentesi tonde si fa partire una nuove shell che esegue quei programmi, e poi possiamo mandare il tutto in background, ad esempio +21:18 <@valhalla> ``(sleep 60 ; date) &`` +21:18 <@valhalla> ancora ``jobs`` e vediamo che sta andando un job con tutti e due i comandi +21:18 <@valhalla> in questo modo, quando sleep ha finito vediamo stampare cose, e ci accorgiamo subito che ha finito +21:19 <@valhalla> mentre un programma è in foreground, possiamo passargli dei segnali +21:19 <@valhalla> che i programmi per unix riconoscono e agiscono di conseguenza +21:21 <@valhalla> con Ctrl-C si passa il segnale SIGINT, che interrompe il programma +21:21 <@valhalla> i programmi poi possono intercettare questi segnali e non farsi interrompere subito, ma ad esempio chiudersi come si deve, ma dipende dal programma +21:21 <@valhalla> ad esempio, lanciamo ``(sleep 100 ; echo "sleep")``, poi premiamo Ctrl-C +21:22 <@valhalla> e con jobs possiamo controllare che non è rimasto niente, il processo è stato fermato +21:22 <@valhalla> domande fin qui? +21:23 <@valhalla> ok, proseguo +21:23 <@valhalla> un altro segnale utile è SIGSTOP, che invece interrompe il processo senza chiuderlo +21:23 <@valhalla> e poi lo si pu`o far riprendere +21:24 <@valhalla> come se lo si mettesse in pausa +21:24 <@valhalla> ad esempio ``(sleep 100 ; echo "sleep")`` poi premete Ctrl-Z +21:24 <@valhalla> e con ``jobs`` potete vedere che c'è quel processo che risulta "Stopped" +21:25 <@valhalla> finché lo lasciate lì non fa niente, non fa neanche passare i 100 secondi prima di chiudersi +21:25 <@valhalla> però ci sono dei comandi coi quali si può far riprendere un processo; con ``fg`` gli si dice di tornare in foreground e ricominciare a funzionare +21:26 <@valhalla> oppure, (per provare potete reinterrompere con Ctrl-Z un'altra volta) +21:26 <@valhalla> con ``bg`` si manda il processo bloccato in background, e lo si fa riprendere +21:27 <@valhalla> questo è il modo in cui si mandano in background dei processi se si è dimenticato di mettere & alla fine del comando, ad esempio +21:27 <@valhalla> con ``jobs`` potete sempre vedere che avete un processo in background, e dopo un po' finalmente vi stamperà "sleep" +21:27 <@valhalla> domande? +21:28 <@diego71> < gioque> che differenza c'?? tra sleep 100; echo "sleep" e (sleep 100; echo sleep) +21:28 <@valhalla> se si scrive ``sleep 100; echo "sleep"`` i due comandi vengono lanciati in successione dalla shell in cui si sta lavorando +21:28 <@valhalla> con le parentesi invece viene aperta una nuova shell ed è lei a lanciare in successione i due comandi +21:28 <@valhalla> col vantaggio che li si pu`o trattare come una cosa unica +21:29 <@valhalla> nel nostro caso per mandarli in foreground/background, ma anche ad esempio per leggere lo stdout di tutti uno dopo l'altro +21:30 <@valhalla> se si scrivesse solo ``sleep 100; echo "sleep" &`` sarebbe solo l'echo ad essere messo in background, sleep rimarrebbe in foreground +21:30 <@valhalla> altre domande? +21:31 <@valhalla> proseguo +21:31 <@valhalla> un'altro modo che abbiamo di mandare segnali ai processi è il comando kill +21:33 <@valhalla> di default anche lui manda il segnale SIGINT, mentre con l'opzione ``-9`` manda il segnale SIGKILL, che non può essere intercettato dai programmi e li fa chiudere ad ogni costo +21:34 <@valhalla> ad esempio, possiamo lanciare un paio di comandi in background: ``(sleep 100 ; echo "primo") &`` e poi ``(sleep 100 ; echo "secondo") &`` +21:34 <@valhalla> ``jobs`` per vedere che ci sono +21:34 <@valhalla> e poi con ``kill %`` possiamo mandare il segnale SIGINT al secondo dei due +21:34 <@valhalla> e aspettando vedremo che solo il primo sarà arrivato a completamento +21:36 <@valhalla> (altre domande? +21:37 <@valhalla> < tiziano> cosa significa il carattere % in kill %? +21:37 <@valhalla> sta per "ultimo processo" +21:37 <@valhalla> lo si può usare anche con fg e bg +21:38 <@valhalla> oltre a % e basta si pu`o anche usare %<numero> e si lavora sul job con quel numero (come viene stampato dal comando jobs +21:39 <@valhalla> ad esempio, ``(sleep 100 ; echo "primo") &`` ``(sleep 100 ; echo "secondo") &`` e poi ``kill %1`` ucciderà il primo dei due, e lascerà andare il secondo +21:39 <@valhalla> altre domande? +21:39 <@valhalla> vado avanti +21:40 <@valhalla> un altro comando utile è ps, che stampa i processi in corso, e di default stampa non solo i processi della shell in corso, ma quelli del *terminale* +21:41 <@valhalla> ad esempio, mettiamoci un po' di roba con ``sleep 100 &`` ripetuto un paio di volte +21:41 <@valhalla> e poi ``ps`` +21:41 <@valhalla> di default quello mostra il PID del processo, che era stato citato prima +21:42 <@valhalla> ovvero, un identificativo univoco del processo su *tutto* il sistema +21:42 <@valhalla> [ditemi sul canale di là per favore se mi state leggendo] +21:44 <@valhalla> dicevo, il PID non è univoco nel tempo: dopo un certo numero riparte a prendere i numeri rimasti liberi da processi che sono stati chiudi +21:44 <@valhalla> ma in ogni momento ci sarà un solo processo con quel PID +21:45 <@valhalla> usando l'opzione ``-f`` di ps si hanno un po' più di dettagli utili +21:46 <@valhalla> e in particolare UID, ovvero l'utente con i cui permessi sta girando quel processo e le opzioni con cui era stato lanciato il comando +21:47 <@valhalla> doamnde? +21:47 <@diego71> pigro> che differenza c'?? tra PID e PPID? +21:47 <@valhalla> PPID è il PID del processo padre del processo elencato +21:47 <@valhalla> ovvero del processo che ha fatto partire il processo in questione +21:48 <@valhalla> con questo possiamo anche vedere la differenza tra ``sleep 100 ; echo "uno"`` e ``(sleep 100 ; echo "due")`` +21:49 <@valhalla> ad esempio se facciamo ``sleep 100 ; echo "uno" +21:49 <@valhalla> `` +21:50 <@valhalla> poi ctrl-z per sospenderlo, e poi ps +21:50 <@valhalla> vediamo che ci sono una bash, sleep e il ps appena lanciato +21:51 <@valhalla> (poi usiamo fg per far tornare attivo lo sleep, o bg per mandarlo in background, cos`i va avanti +21:51 <@valhalla> se invece scriviamo ``(sleep 100 ; echo "due")``, poi sempre ctrl-z per fermarlo +21:52 <@valhalla> a quel punto con ``ps`` vediamo che ci sono due bash, uno sleep e poi ps +21:52 <@valhalla> e anzi, se usiamo ps -f vediamo che il parent della seconda bash e del ps è la prima bash +21:52 <@valhalla> mentre sleep ha come parent la seconda bash +21:52 <@valhalla> altre domande? +21:54 <@valhalla> ok, dovrei aver finito il backlog delle domande a cui avevo detto rispondo dopo +21:54 <@valhalla> se manca qualcosa, perfavore rifatela +21:54 <@valhalla> intanto vado avanti dicendo che: +21:54 <@valhalla> il PID pu`o essere usato anche come parametro di kill, per mandare segnali a processi non necessariamente sulla stessa shell +21:55 <@valhalla> ad esempio, diamo il solito ``sleep 100 &`` +21:55 <@valhalla> vediamo che ci stampa il numero di job tra parentesi e dopo il suo pid +21:55 <@valhalla> possiamo controllare che lo sia con ps +21:55 <@valhalla> e poi possiamo ucciderlo con ``kill $PID`` +21:55 <@valhalla> dove ovviamente al posto di $PID metterete il numero visto prima +21:56 <@valhalla> per trovare il PID di processi che non conoscete si usa sempre ps +21:56 <@valhalla> con ``ps -e -f`` si vedono tutti i processi del sistema +21:56 <@valhalla> anzi, meglio ``ps -e -f | less`` :) +21:57 <@valhalla> oppure ``ps -e -f | grep $NOME_DEL_PROGRAMMA_CHE_VI_SI_E_PIANTATO`` :) +21:58 <@valhalla> oppure in qualche caso è utile ``-u $NOME_UTENTE`` al posto di ``-e`` per vedere solo i processi di qualche utente +21:58 <@valhalla> domande? +22:00 <@diego71> < pigro> se per errore invio il kill al PPID +22:00 <@valhalla> pigro: uccidi il PPID (e a catena di solito anche tutti i suoi figli) +22:01 <@valhalla> a meno che si cerchi di killare un processo di qualche altro utente, nel qual caso lo si può fare solo se si è root +22:01 <@valhalla> altre domande +22:01 <@diego71> < gioque> per mettere in pause (tipo ctrl+z) un processo che non sia l'ultimo? (tipo se ho tre jobs e volgio mettere in stato stopped [non killed] il n 2 come faccio?) +22:02 <@valhalla> porti in foreground il processo che vuoi stoppare con ``fg %2`` (ad esempio), e poi usi ctrl-z +22:02 <@valhalla> altre domande? +22:03 <@diego71> < polva> valhalla, c'era quella domanda su come distinguere tra shell e processo +22:03 <@valhalla> in che senso distinguere tra shell e processo? +22:04 <@diego71> < polva> riposto: ! valhalla ha detto che usare le parentesi fa avviare una nuova shell. a me si avvia sempre nella stessa. parte solo un altro comando +22:04 <@valhalla> avevamo visto l'esempio prima che con ps faceva vedere che tra i processi attivi c'era una nuova bash +22:05 <@valhalla> dalle 21:49 in poi nel log +22:05 <@valhalla> non si apre un nuovo *terminale*, solo una nuova bash all'interno nello stesso terminale, se era questo il tuo dubbio +22:05 <@valhalla> altre domande? +22:07 <@diego71> < tiziano> che segnale viene emesso esattamente con ctrl-z? +22:07 <@valhalla> SIGSTOP +22:08 <@valhalla> ultimo comando per la serata, il comando ``top`` +22:08 <@valhalla> vi fa vedere i processi attivi in ordine di risorse usate, e aggiornandosi in tempo reale +22:09 <@valhalla> di default ordina per chi sta usando più CPU +22:09 <@valhalla> per i dettagli del significato dei vari campi pagina di manuale, che sennò ci vorrebbe una lezione intera +22:09 <@valhalla> ma se avete il computer piantato, è probabile che il colpevole sia uno dei primi nomi che saltano fuori :) +22:10 <@valhalla> e adesso possiamo proseguire con le domande rimaste +22:10 <@valhalla> (ah, poi q per uscire da top) +22:11 <@diego71> < pigro> a me prima non mi faceva il kill di un processo che era stoppato +22:11 <@valhalla> questo perché SIGINT è un segnale che il processo può elaborare +22:11 <@valhalla> di default quello che fa è uscire subito +22:11 <@valhalla> ma potrebbe anche fare qualcosa prima +22:12 <@valhalla> e se è stoppato, non pu`o neanche fare l'elaborazione "ah, un SIGSTOP, allora esco" +22:12 <@valhalla> ehm, SIGINT, non SIGSTOP +22:12 <@valhalla> sorry +22:12 <@valhalla> (nell'ultima riga) +22:12 <@valhalla> altre domande? +22:13 <@valhalla> < MrPan> htop è una versione "potenziata" del comando top ? +22:13 <@valhalla> pi`u o meno sì, nel senso che è un programma che fa cose simili +22:14 <@valhalla> però top c'è di default nei sistemi, htop va eventualmente installato +22:14 <@valhalla> altre domande? +22:15 <@valhalla> < gioque> se io ho messo subito in pausa con ctrl+z un processo es (sleep 10; echo "test") e faccio fg di dopo 10 secondi mi scrive subito test, è normale o dovrebbe aspettarmi 10 secondi? +22:15 <@valhalla> no, dovrebbe aspettarti 10 secondi +22:16 <@valhalla> per`o quei 10 secondi comprendono il tempo impiegato a mettere in pausa il processo dopo averlo lanciato +22:16 <@valhalla> e quelli da quando fai fg fino a quando stampa +22:17 <@valhalla> uhm, per`o in effetti ho appena provato, esce subito +22:18 <@valhalla> <@diego71> gioque: probabilmente ricordavo male io, la sleep aspetta 10 secondi a prescindere da ^Z +22:19 <@valhalla> la pagina di manuale in effetti non lo dice +22:19 <@valhalla> (ed è anche vero che nella vita reale no `e che lo si usi in questo modo) +22:20 <@diego71> < stefano_> leggendo il man mi chiedevo cosa volesse dire: "<Left> force a screen redraw (if necessary)" +22:20 <@valhalla> significa che se si preme il tasto "freccia a sinistra" il programma top ridisegna lo schermo +22:21 <@valhalla> cosa che di solito fa ogni tot secondi, ma se premi lo fa nel momento in cui hai premuto +22:22 <@diego71> < erio> sleep 10 ; echo "OK". Poi ctrl Z e poi fg ...per?? non mi stampa "ok" +22:22 <@valhalla> in realtà te l'ha stampato quando hai fatto ctrl-z, perché non avendo le () attorno hai sospeso il primo processo (lo sleep) e quindi il secondo (l'echo) è partito +22:22 <@valhalla> altre domande? +22:24 <@diego71> < polva> una domanda teorica. mi sfugge come mai sia necessario invocare un'altra bash per far fare due operazioni insieme. +22:24 <@diego71> ok, ti rispondo io +22:24 <@diego71> la comodita' e' che hai un solo processo figlio che fa tutti i comandi uno dopo l'altro +22:25 <@diego71> quindi se fai per esempio ^Z stoppi tutta la sequenza, invece che solo il primo come nel caso di erio +22:26 <@valhalla> e per poter raggruppare il tutto assieme ti serve un processo che abbia un numero, quindi si lancia un processo bash +22:27 <@valhalla> altre domande? +22:28 <@valhalla> allora, come gi`a detto all'inizio +22:28 <@valhalla> il corso con stasera è finito, nel materiale c'è un file approfondimenti.rst con link ad un paio di documenti utili +22:29 <@valhalla> in particolare, gli Appunti di Informatica Libera contengono fondamentalmente TUTTO :) +22:29 <@valhalla> mentre bash guide for beginners e poi advanced bash scripting guide sono utili per approfondire l'argomento shell +22:29 <@valhalla> settimana prossima faremo una serata dedicata a domande e risposte +22:30 <@valhalla> così se qualcuno ha qualche domanda arretrata che gli è venuta in mente tra una serata e l'altra può farla +22:32 <@valhalla> e detto questo, chiudo e mi metto a preparare i log |