Visualizzazione post con etichetta comandi. Mostra tutti i post
Visualizzazione post con etichetta comandi. Mostra tutti i post

giovedì 20 dicembre 2007

Input singolo Output multipli - tee

A dire il vero non so se questo sia un comando "nativo" di Unix o un Shell-Tool introdotto dalla GNU. In ogni caso io mi riferisco, in queste righe, alla versione GNU di tee. L'idea che sta alla base di tee è semplice, come la sua realizzazione, ma molto efficace: Copiare lo standard-input sullo standard-output e su altri files contemporaneamente. Come molti tool, e filtri, per shell tee ha un senso pratico se lo si usa con redirezione e pipe.

Possiamo quindi considerare tee come una "multipla" o qualcosa di simile... magari un giunto a T! Con un poco di pratica ci si capisce meglio:
:~/esempi$ ls
:~/esempi$ tee pluto.txt
Io scrivo e tee ripete allo standard-output
Io scrivo e tee ripete allo standard-output
Esattamente come fà cat a prima vista
Esattamente come fà cat a prima vista
Premo ctrl+d (EOF) per terminare tee
Premo ctrl+d (EOF) per terminare tee
mesillo@stellascura:~/esempi$ ls
pluto.txt
:~/esempi$ cat pluto.txt
Io scrivo e tee ripete allo standard-output
Esattamente come fà cat a prima vista
Premo ctrl+d (EOF) per terminare tee
:~/esempi$
Come si vede dal primo ls la directory esempi è vuota. Avviamo tee, $tee pluto.txt, e, al suo termine, troviamo un file (pluto.txt appunto) contenete le righe che avevamo digitato. tee è in grado di copiare lo standard-input su più files, basta specificare una lista di nomi/path alla riga di comando:
$ tee file1 file2 file3 ...Ovviamente tutti i files avranno lo stesso contenuto.
Le due opzioni di maggior rilievo, almeno a parer mio, di tee sono:
  • -a : output su file in modalità append, gli eventuali dati già presenti non vengono cancellati.
  • -i : ignora i SIGINT (ctrl+c) che eventualmente dovesse ricevere. Utile nell'uso con certi programmi.
Un esempio un poco più pratico: voglio salvare l'output di dmesg in un file e leggere solo le prime 10 righe allo standard-output immediatamente.
:~/esempi$ dmesg | tee dmesg_file.txt | head
Vedrete apparire subito le prime 10 righe, dei messaggi di avvio del Kernel, mentre nel file, dmesg_file.txt, saranno presenti tutte quante.

venerdì 7 dicembre 2007

Redirezione e Pipelining

Una delle caratteristiche che ha portato al successo le prime versioni di Unix è sicuramente la capacità di redirigere i flussi e creare pipe. In particolare la redirezione dei tre flussi standard e l'uso delle pipe per accoppiare più comandi.
Va detto che le due cose dipendono una dall'altra. Una pipe è un meccanismo messo a disposizione dal sistema che permette di mettere in comunicazione due processi. Senza la capacità di redirigere i flussi però non si avrebbe la necessaria flessibilità per permettere di arrivare alla filosofia del "poco ma ben fatto".
Mi spiego meglio: una delle caratteristiche dei tool di Unix, a differenza di quelli di Multix, è assere realizzati per svolgere una sola semplice funzione nel miglior modo possibile.
Un esempio pratico è il comando cat, che a prima vista non fà nulla di utile; provate ad aprire una Shell e a dare il comando cat:
:~$ cat
questo ripete tutto quello che scrivo
questo ripete tutto quello che scrivo
quando batto invio lui ripete la riga pari-pari
quando batto invio lui ripete la riga pari-pari
a prima vista sembrerebbe una cosa assurda
a prima vista sembrerebbe una cosa assurda
ma chi usa Unix non potrebbe farne a meno
ma chi usa Unix non potrebbe farne a meno
per uscire da questa situazione premo ctrl+d
per uscire da questa situazione premo ctrl+d

:~$
A cosa serve un programma del genere? Se non esistesse modo di redirigere i flussi e creare pipe praticamente a nulla! Ma, con i dovuti supporti del sistema operativo, cat mi può servire a mille scopi.

I flussi e la redirezione:

Partiamo dal concetto base, forse un poco spartano a dire il vero, per il quale: per Unix tutto è un file! Con tutto intendo anche tastiera e monitor/video. Questo può sembrare una masochistica complicazione ma, in realtà, ci facilita la vita in una maniera impressionate (sia a livello di realizzazione che utilizzo di un software)! Vediamo il perchè:
  • Ho un programma che legge i dati da tastiera e li scrive a video.
  • La tastiera è un file.
  • Il video è un file.
  • Il mio programma può leggere da un file.
  • Il mio programma può scrivere su un file.
Qui serve però un'altro poco di teoria, prima di passare alla pratica, per capire bene.
  • Un processo può aprire (avere accesso a, se preferite) file durante l'esecuzione del suo programma
  • Un file aperto, da un processo, lo chiameremo flusso
  • I file si possono aprire nelle due modalità (in realtà sono di più di due, ma per ora va benone così) lettura o scrittura.
Un processo al suo avvio, cioè prima che esegua qualunque istruzione, ha già tre flussi (file) standard aperti.
  • stdin: lo standard input, normalmente la tastiera (lettura)
  • stdout: lo standard output, normalmente lo schermo (scrittura)
  • stderr: lo standard error, normalmente lo schermo (scrittura)
Per redirezione si intende sostituire a questi flussi degli altri a nostro gradimento. Ma ora si capisce meglio con la pratica:
:~/esempi$ ls
:~/esempi$ cat > pippo.txt
Ora scrivo ma cat non ripete
le mie righe a video...
Come mai?
Semplice, le stà scrivendo dentro al file pippo.txt
... provare per credere!
:~/esempi$ ls
pippo.txt
:~$
La directory esempi era vuota, lo si vede dall'output del primo ls. Dopo l'esecuzione di cat invece è comparso il file pippo.txt. Cosa è successo?
Abbiamo "imbrogliato" cat sostituendogli il flusso verso lo schermo con quello verso il file pippo.txt, che è stato appositamte creato. Tutto stà nel simbolo di redirezione dell'output >. Ora se aprissimo pippo.txt con il nostro editor di testo preferito vedremmo che contiene le righe da noi scritte. Ma, visto che vogliamo redirigere, possiamo anche usare cat per verificare. L'output di $cat < pippo.txt sarà:
Ora scrivo ma cat non ripete
le mie righe a video...
Come mai?
Semplice, le stà scrivendo dentro al file pippo.txt
... provare per credere!
Quindi, per redirigere l'input usiamo il simbolo <. La faccenda non è difficile da ricordare, basta considerare i simboli di redirezione come frecce:
  • Redirezione input - freccia da file al programma: $nomeprog < file_input
  • Redirezione output - freccia da programma al file: $nomeprog > file_output
Ovviamante le due cose possono essere fatte contemporanemte:
  • Redirezione input e output: $nomeprog > file_output < file_input
Per la redirezione dello standard output esiste una modalità speciale, chiamata append, che permette di aggiungere le righe dell'output dopo quelle già esistenti nel file. Infatti la redirezione normale dello standard output su un file già esistente provoca la sostituzione del contenuto di quest'ultimo.
  • Redirezione stdout in modalità append: $nomeprog >> file_output
Vista la redirezione, che anche certe versioni di DOS sono in grado di fare, passiamo ora ai tubi!

Pipes:

Tubi è il nome che meglio si addice a queste particolari strutture messe a disposizione da Unix. Abbiamo visto come sia facile sostituire lo stdin di un processo con un file. Abbiamo visto come sia facile farlo anche con lo stdout.
Sarebbe bello, a questo punto, vedere se si può sostituire lo stdin di un processo con lo stdout di un'altro. Secondo voi?
Dobbiamo pensare la pipe esattamante come un tubo. Un tubo attraverso il quale non scorre acqua ma caratteri. Mettere in pipe due processi significa collegarli.
Uno sguardo veloce a grep:
:~/esempi$ grep pippo
grep non è come cat
lui non ripete tutte le righe
ma solamente quelle che gli ho detto di cercare
in questo caso particolare solo quelle che
contengono la parola pippo
contengono la parola pippo

Mario và al mare
pippo và in montagna
pippo và in montagna

per uscire uso ctrl+d
:~/esempi$
Quindi dare un comando come $grep pippo vuol dire cercare nello stdin tutte le righe che contengono la parola "pippo". E se volessimo controllare quali righe contengono la parola "video" nel file pippo.txt?
:~/esempi$ cat pippo.txt | grep video
le mie righe a video...
:~/esempi$
E così abbiamo scoperto come si possono mettere in comunicazione due processi tramite pipe: $nomeprog1 | nomeprog2. Il simbolo che usiamo per creare le pipe è |. Mi rendo conto che l'esempio è stupido, infondo possiamo ottenere lo stesso risultato con: $grep video < pippo.txt. Ma è un caso dovuto alla semplicità dell'esempio. Mettiamo invece di voler controllare se sul nostro sistema gira apache:
:~/esempi$ ps ax | grep apache
2958 ? Ss 0:00 /usr/sbin/apache2 -k start
2996 ? S 0:00 /usr/sbin/apache2 -k start
2997 ? S 0:00 /usr/sbin/apache2 -k start
2998 ? S 0:00 /usr/sbin/apache2 -k start
2999 ? S 0:00 /usr/sbin/apache2 -k start
3000 ? S 0:00 /usr/sbin/apache2 -k start
3386 pts/0 R+ 0:00 grep apache
Comodo no? Senza pipe non avremo potuto dire a grep di cercare per noi nell'output di ps. Se volete avere un'idea di come la faccenda semplifichi estremamente la vita provate a dare un $ps ax e a cercare voi stessi quello che vi interessa.

In fine dei conti una pipe è un speciale file, temporaneo, che viene sostiuito allo stdout del primo programma, della linea di comando, e, contemporanemamte, allo stdin del secondo. Ci permette quindi di redirigere l'output di un processo nell'input di un'altro.

Anche le pipes possono essere multiple:
$prog1 | prog2 | prog3 | prog4

Un riassuntino grafico può aiutare a fissare le idee?

Redirezione stdout: $ prog > file

Redirezione stdin: $ prog < file

Pipe: $ prog1 | prog2

Immagini realizzate con Dia: http://live.gnome.org/Dia

martedì 27 novembre 2007

Time to leave!

Sta volta voglio affrontare l'uso di un comando/programma di Unix che alcuni potrebbero considerare un poco anacronistico. Stò parlando di leave. Un programmino che gira in background e che ci aiuta a non perdere la cognizione del tempo. In sostanza leave è una sveglia/timer.

Si può settare leave per avvisarci ad una data ora o fra un tot di tempo.
:~&leave +15
Per ricordarci di andarcene fra 15 minuti.
:~&leave 2115
Per ricordarci che dobbiamo sortire alle 21:15.
Se dovessimo invocare leave senza argomenti sarebbe lui stesso a chiederci esplicitamente quando avvertirci.
:~$ leave
When do you have to leave?
La maniera per rispondere è la stessa con cui passare i parametri direttamente a linea di comando. La conferma dell'avvenuto avvio di leave sarà, in tutti i casi, sempre una cosa del tipo:
Alarm set for Tue Nov 27 20:00. (pid 6124)
Mi sembra che non ci sia nulla da spiegare!
Una volta settato leave lascierà l'utente libero di lavorare, alla shell ovviamente, fino a 5 minuti prima dell'ora X. A cinque minuti partirà il primo avviso. Ad 1 minuto il secondo. All'ora X e ogni minuto successivo leave disturberà l'user ricordandogli che deve andarsene. Solo dopo 10 minuti dallo scadere del timer leave si cheterà!

I mesaggi di leave:
You have to leave in 5 minutes.
Just one more minute!
Time to leave!
[...]
That was the last time I'll tell you. Bye.
Dopo lo scadere certe versioni/implementazioni ripetono sempre "Time to leave!" altre invece si sbizzarriscono con messaggi più vari.

Bisogna ricordarsi che leave è un programma/processo "normale" e quindi dipende dall padre. Insomma, se chiudete la shell da cui lo avete avviato chiudete anche lui, inoltre non usa files per memorizzare le impostazioni che quindi sono "labili".
Certe versioni/implementazioni usano accompagnare i messaggi anche con il suono della campanella di sistema (beep). A parole sembra una vaccata ma vi giuro che funziona... stressa da morire!

leave usa un modo abbastanza singolare per interpretare gli orari che gli passate, mi spiego meglio; se siamo di pomeriggio e diamo un comando del tipo:
:~$ leave 0830
Alarm set for Tue Nov 27 20:30. (pid 7071)
leave non intende "0830" come le otto e trenta minuti del mattino successivo ma come le otto e mezza della sera stessa (le venti insomma). Lo si capisce anche dall'output di conferma.

Non tutti i sistemi, ormai, adottano leave nella installazione "standard".
Nel caso di Debian etch si può seguire la più canonica delle vie:
:~$apt-get update
:~$apt-get install leave

giovedì 22 novembre 2007

screen: terminale multitasking!

Unix (ed i sistemi Unix-Like) è un sistema operativo multitasking e multiutente. L'interfaccia utente "preferenziale" di Unix è una Shell che gira su un terminale. La Shell è un'interfaccia a caratteri del tipo "linea di comando". Passi che più utenti si possono collegare contemporaneamente al sistema attraverso terminali, ma come fà un singolo utente a far girare più programmi sulla sua shell? Oggi come oggi, nell'era della finestra, sembra impossibile vero? Forse a qualcuno anche inutile!? Avvio il mio bel Server X col mio Desktop/Window Manager preferito e sono a cavallo!... e se mi devo connettere da remoto con ssh ad esempio?!? Situazione, questa, che emula bene l'uso dei vecchi terminali fisici. Nessun problema, una soluzione è screen!

Una delle "sciccherie" di screen è prorio quella di fornirci un terminale multitasking. Cioè un terminale in cui possiamo eseguire più programmi contemporaneamente. Passando dall'uno all'altro senza problemi e, sopratutto, senza interrompere il loro funzionamento.

Screen lavora a sessioni. Una sezione di screen può contenere diversi programmi in esecuzione (processi). Una sezione "nasce" con una chiamata a screen. Una sezione "muore" con la chiusura dell'ultimo processo ad essa associato.
Screen avvia una nuova sessione quando lo si chiama specificando un programma da avviare o senza nessun parametro (in questo caso avvia una istanza della shell di default *).
:~$screen
Avvio una finestra contenente una shell.
:~$screen joe
Avvio una finestra contenente joe.
Consideriamo screen come un gestore di finistre a tutto schermo. Ogni finestra contine un programma. Una sessione contiene più finestre (almeno una).
Passo successivo, necessario prima di passare ad un poco di pratica, è capire la relazione tra sessione e soket. Chiariamoci da subito che questa nomenclatura è propria di screen e, quindi, può risultare ingannevole:
  • Soket: ciò che screen chiama soket è in relatà, per il SO, una PIPE con nome.
  • Sessione: una sessione di screen non è altro che un processo del SO che esegue screen.
Fatti i dovuti chiarimenti ora continuiamo ad usare la terminologia di screen. Per screen ogni sessione è associata ad un socket. Questo fatto è necessario per un uso più avanzato di screen di quello che voliamo fare noi, almeno per ora. Tuttavia dovremo comunque conoscere questo aspetto per poter controllare le sessioni che andiamo ad avviare. Allora, schematizzando:
1 soket=>1 sessione=> N finestre=> N programmi.
Per ragioni di sicurezza evitate sempre di abbandonare il sistema con sessioni di screen aperte. Chiudetele tutte se lasciate la macchina accessa, e sopratutto se rimane connessa alla rete. Screen è molto potente ma comporta dei rischi. Questo non deve scoraggiare il suo uso ovviamente. Per ora teniamoci a mente che screen non realizza soltanto un terminale multitasking.

Passiamo alla pratica:
Abbiamo visto due maniere per avviare screen. Per ora, onde evitare confusioni, useremo quella con parametro. Usiamo un programma "vistoso", tipo mc, per aiutarci.
:-$screen mc
A prima vista è tutto come se avessimo avviato normalmente mc. Ora però premiamo ctrl+a e successivamente d. Vedremo che torniamo alla shell di "partenza" con questo output:
:~$ screen mc
[detached]
:~$
Che cosa è successo?
  • Abbiamo, tramite il primo comando, avviato una sessione di screen nella quale la prima finestra contiene un mc.
  • Abbiamo usato un comando interattivo di screen per distaccare la sessione dal terminale.
Questo secondo punto merita delle spiegazioni. Per "comandare" le finestre di screen non si usa il mouse ma la tastiera. Per impartire a screen un comando lo si deve "avvertire" prima. Avvertirlo significa specificare che l'input è per lui e non per il programma che gira nella finestra. Per "avvertire" screen che stiamo per impartirgli un comando si usa la combinazione di tasti ctrl+a **. A questo punto diamo il comando d che sta per "detach", è un poco come mettere in pausa un'intera sessione. Cioè come accontonarla temporanemente. Mentre la sessione è staccata, e noi quindi non stiamo lavorando in nessuna finastra, il nostro mc continua a girare indisturbato; se fosse un wget continuerebbe a scaricare ad esempio. Qui già si possono intuire altre potenzialità di screen.

Ora concentriamoci sulle soket, dovremmo averne una a questo punto. Come faccimao a controllare?
:~$screen -ls
oppure
:~$screen -list
Ci dovrebbe apparire un otput del tipo:
There is a screen on:
4596.pts-0.stellascura (Detached)
1 Socket in /var/run/screen/S-mesillo.
Analiziamo in particolare la seconda riga. Questa descrive la maniera di nominare le soket/sessioni di screen. Dobbiamo leggerla come:
[pid di screen].[terminale a cui è attaccata la sessione].[hostname] ([stato])
Chiariamo alla menopeggio il concetto di attaccato e staccato per una sessione rispetto ad un terminale. Quando una sessione è attaccata ad un terminale vuol dire che una delle sue finestre lo "occuperà". Sò che è riduttivo e in parte inesatto ma per ora vediamola così. Ricordiamoci che un processo (programma) può benissimo continuare a girare anche quando è staccato da un terminale.

Adesso abbiamo la nostra sessione distaccata e vorremmo riattaccarla. Per fare ciò si usa l'opzione -r, che può essere accompagnata da parametro oppure no. Se si usa r senza parametro screen attaccherà al terminale in uso la prima sessione disponibile. Nel nostro caso v'è n'è una solamente quindi ci và più che bene.
:~$screen -r
Se, invece, avessimo più sessioni potremmo usare un comando del tipo:
:-$screen -r 4596.pts-0.stellascura
o se volessimo usare solo il pid della sessione:
:-$screen -r 4596
potremmo, addirittura, specificare solo il nome del terminale. Screen è "intelligente" e, se non forniamo informazioni ambigue (eg.: due sessioni con lo stesso terminale), riesce spesso a capire cosa vogliamo.
A questo punto vedremo riapparire il nostro mc. Chiudiamolo e vedremo un output a shell del tipo:
:~$ screen -r
[screen is terminating]
mesillo@stellascura:~$ screen -list
No Sockets found in /var/run/screen/S-mesillo.

mesillo@stellascura:~$
Il successivo controllo delle soket ci dirà che nessuna sessione è apera.
Vediamo ora come dare un nome alle sessioni per meglio riconoscerle senza doversi ricordare i pid.
:~$screen -S pippo mc
L'opzione in questione è -S con la S maiuscola. Ora distacchiamo la sessione e controlliamo le soket attive. Osserveremo un otput del tipo:
There is a screen on:
8652.pippo (Detached)
1 Socket in /var/run/screen/S-mesillo.
Possiamo riattacare la sessione con:
:~$screen -r pippo
Credo che con molte sessioni attive sia comoda questa possibilità.

Ora è il momento di aggiungere delle nuove finestre alla nostra sessione. Per farlo usiamo il comando interattivo c quindi premiamo ctrl+a e c. Ci apparirà una shell (quella di default *), in una nuova finestra, attraverso la quale possiamo avviare il programma che preferiamo. Per comodità di chi scrive ammettiamo di avviare joe.
Possiamo spostarci da una finestra all'altra con diversi comandi. Tenete conto che screen tratta le finestre come se fossero inserite in una lista. Ogni finestra ha il suo numero. La prima che avete avviato sarà la numero 0, la seconda la numero 1, ecc... . La lista è ciclica, ossia dopo l'ultima finestra si torna alla prima e, di conseguenza, prima della prima c'è l'ultima.
Fatte le dovute premesse ecco la lista dei comandi.
  • n: ci si sposta alla finestra successiva.
  • p: ci si sposta alla finestra precedente.
  • n: (dove n è un numero da 0 a 9) ci si sposta alla finestra numero n.
Quindi, nel nostro esempio: con p torniamo a mc, con n andiamo a joe, con 0 ancora a mc e con 1 a joe di nuovo. Ben s'intende che, essendo questi comandi dinamici, vanno tutti, e sempre, preceduti da ctrl+a.

Chiudere una finestra non è difficile, basta chiudere il programma, o la shell (exit), che essa contiene. Quando chiudiamo l'ultima finestra di una sezione terminiamo anche la sezione stessa ed il suo soket scompare.

Ora sappiamo:
  • Avviare una sezione (con nome anche).
  • Creare delle finestre.
  • Muoverci tra le finestre.
  • Chiudere le finestre e le sessioni.
  • Staccare una sessione.
  • Controllare le sessioni aperte.
  • Attaccare una sessione.
Abbiamo visto solo parte delle funzioni di screen. Ed abbiamo imparato a sfruttarlo solo in maniera base. Infatti screen è uno strumento potente quasi al limite del pericoloso a volte. Parte delle potenzialità di screen si sono certamente intuite fin qui, ma per ora ci accontentiamo del nostro bravo terminale multitasking!

Teniamo sempre a mente che screen altera un poco il comportamento dei programmi. Basti pensare al fatto che si impadronisce della combinazione ctrl+a. Alle volte è anche costretto a modificare, anche se solo in modo temporaneo, l'otput dei programmi per avvisarci di qualcosa. Proprio per ovviare a questi problemi screen prevede l'uso di file di configurazione che, volendo, ne alterano, anche di molto, il comportamento per poterlo adattare alle varie esigenze. Per ora però non vado oltre. Se non resistite alla curiosità non vi resta che dare un man screen.



Utenti Debian etch: potrebbe capitare che sulla vostra distribuzione screen non sia incluso di default... il procedimanto per installarlo è quello canonico!
:~$su
passwd:
:~$apt-get update
:~$apt-get install screen
Non dovrebbe nemmeno chiedervi di risolvere delle dipendenze.

(*)Controllare la shell di default:
:~$echo $SHELL
(**) Dovessimo mai passare al programma nella finestra proprio ctrl+a basterebbe usare ctrl+a e a.

lunedì 19 novembre 2007

Che cosa fanno i miei utenti? (w)

Un comando molto poco conosciuto da chi usa Unix come workstation è w. Esatto, un solo carattere! Sostanzialmente questo minuto (almeno nella sintassi base) comando serve a rispondere alla domanda: "che cosa stanno facendo gli utenti attualmente connessi al sistema?". Domanda che certo si fanno molto spesso gli amministratori di sistemi "multiutenza", che sicuramente conoscono il comando.

Anche se ad un utente Home-Desktop il comando w può sembrare pressochè inutile vale comunque la pena ricordarlo.
Bisogna ricordarsi che Unix è un sistema fortemente portato alla multiutenza e viene usato, ancora oggi, su macchine sulle quali molti utenti possono lavorare contemporaneamete. Il sistema di login di Unix infatti non serve soltanto a gestire utenti diversi, quindi con profili e privilegi diversi, che possono accedere alla macchina in tempi diversi, come avviene in altri sistemi.
Ora, in un contesto simile, ad un amministratore un comando come w può tornare molto utile.

Passiamo alla pratica:
La sintassi più semplice di who è quella senza nessuna opzione o parametro.
mesillo@stellascura:~$ w
17:55:44 up 58 min, 2 users, load average: 0,08, 0,10, 0,09
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
mesillo :0 - 16:58 ?xdm? 1:21m 0.29s x-session-manager
mesillo pts/0 :0.0 17:30 0.00s 0.00s 0.00s w
In questo modo otteniamo la lista di tutti gli utenti connessi attualmente alla macchina. Andiamo con ordine ed analizziamo la prima righa (detta anche header).
  • ora attuale
  • tempo da cui il sistema è avviato
  • numero di utenti connessi
  • carico medio del sistema nell'ultimo minuto
  • carico medio del sistema negli ultimi cinque minuti
  • carico medio del sistema nell'ultimo quarto d'ora
Segue una riga che riassume il significato delle colonne sottostanti.
Poi arrivano i dati salienti.
  • nome dell'utente (o meglio login-name)
  • terminale a cui è connesso
  • host da cui è connesso
  • l'ora in cui si è connesso
  • tempo di inattività (indicativamente da quanto tempo non preme un tasto)
  • tempo di tutti i processi agganciati al terminale in questione (seconda colonna), compresi quelli in background attivi.
  • tempo del processo in esame (colonna successiva what)
  • comando dato per avviare il processo in esame (eg: ls -l pippo/)
Esistono anche delle opzioni e parametri che w accetta, la più semplice è l'username.
Quindi, se io volessi vedere solo le informazioni relative all'utente "pippo" dovrei dare un comando del tipo:
:~$w pippo
Utile se ho molti utenti connessi.
Per una lista completa delle opzioni vi rimando alla pagina di manuale di w.
:~$man w
Una opzione in particolare però và citata per una sua particolarità; -f. Infatti questa opzione dovrebbe servire a visualizzare, nell'output, la colonna FROM (terza). Questa colonna in certi casi, dipende da come è stato compilato w nel vostro sistema, è sempre presente nell'output di "default". Se il vostro w è così fatto (eg.: Debian etch) l'opzione -f sarà comunque ritenuta valida ma non sortirà nessun effetto (ovviamente!).

Adesso non vi resta che giocare un poco con w.