.dsy:it. Pages (39): « 1 2 3 [4] 5 6 7 8 » ... Last »
Show 150 posts per page

.dsy:it. (http://www.dsy.it/forum/)
- Sistemi operativi I (http://www.dsy.it/forum/forumdisplay.php?forumid=269)
-- Esame di laboratorio (Giugno 2007) - Domande (http://www.dsy.it/forum/showthread.php?threadid=31182)


Posted by GiKappa on 12-07-2007 10:20:

ho una domanda:

ho letto il manuale di xargs, ma non riesco a capire quando va usato e quando no! ho visto che viene usato dopo una pipeline per comandi come tar o ls, ma perchè non si usa con comandi come sort o tail?

qualcuno mi può spiegare (anche in due righe) a cosa serve esattamente?

grazie!


Posted by n3o on 12-07-2007 10:49:

xargs è un comando utile per evitare l'errore Out of space che a volte compare se si utilizza il find.
La shell ha un limitato spazio per gestire un comando (credo 256 caratteri...) quindi se un input di un comando (rediretto anche con un pipe) supera tale limite sorge l'errore di cui sopra.
Per evitarlo si utilizza xargs che non fa altro che spezzare l'output del comando precedente in righe, e passare ogni riga al comando successivo, una alla volta.
Più importante, xargs cambia profondamente il comportamento dei comandi:

find / -type f | grep login

Questo comando cerca tra la lista dei file del sistema, un file il cui nome contenga la parola login

find / -type f | xargs grep login

In questo esempio xargs spezza la listona dei file del sistema e passa una riga per volta (quindi un nome di file per volta) a grep
(grep viene eseguito più volte, una volta per ogni riga).
Notate che il comportamento cambia moltissimo!!!
In questo caso il comando stampa tutti i file di sistema che contengono al loro interno la parola login

Nella maggior parte degli esempi sort e tail vengono usati sulle liste di file che genera find o in passi successivi, per questo non viene utilizzato xargs.

__________________
The answer is blowing in the wind...


Posted by GiKappa on 12-07-2007 11:05:

ok, grazie!

ho ancora un paio di dubbi:

ho provato a modificare un esercizio (quello di trovare tutti i file con all'interno la parola "login"), facendo in modo che invece che mettermeli in un archivio, me li scriva su un file .txt
allora ho provato a sostituire il comando del tar con > login.txt ma non mi ha inserito niente se non la riga "<stdio.h>"

dove ho sbagliato?

un'altra cosa: se ho un file .txt, che comando posso usare per farmelo vedere a video senza usare elvis?

grazie ancora


Posted by n3o on 12-07-2007 12:08:

Prova con:

find / -type f | xargs grep -l "login" >> list.txt

Il simbolo >> concatena ogni riga al termine del file, mentre > sovrascrive il file prima di aggiungere del contenuto

Per vedere un file senza elvis puoi:

__________________
The answer is blowing in the wind...


Posted by NoWhereMan on 12-07-2007 13:34:

Originally posted by n3o
[B]@NoWhereMan: Si si basta anche la semplificazione che hai fatto.
Io ho solo estratto gli unici due campi di interesse, ma è una formattazione in più che in sede di esame serve forse ad avere il massimo dei punti.


be', tecnicamente la domanda è "trovare il processo che occupa più memoria ram", non "trovare il PID e il nome del processo ecc ecc" :P

Ho poi controllato ciò che hai detto e in effetti contrariamente a ciò che dice il manuale sembra funzionare anche il nome dell'utente come parametro dell'opzione user del find :D

Ovvio che se ti chiede di scorrere tutti gli utenti devi comunque lavorare sul file /etc/passwd

Il comando uniq è fondamentale visto che in sede di esame c'erano più utenti con l'UID 0 (e si potrebbe creare anche più utenti con lo stesso nome mettendo mano a quel file, quindi è utile in ogni caso...)


anche qui, se vuoi è pignoleria da parte mia (e probabilmente hai comunque più ragione tu di me :P); molte volte ho fatto notare queste cretinate in altri frangenti, e ovviamente con professori che a domande precise non richiedono risposte puntuali (al contrario, le domande di questi vanno interpretate, come forse in questo caso)

Il punto è che se mi si chiede di trovare $informazione per ogni utente, allora anche se due utenti hanno lo stesso UID, sono comunque distinti (potrebbero comunque avere home e probabilmente username diversi)

d'altro canto usare anche 'uniq' dovrebbe mostrare di conoscere ulteriormente l'ambiente;

in definitiva la risposta corretta forse potrebbe essere fornire entrambe le alternative, motivandole.

:P

grazie per i consigli!


Posted by GiKappa on 12-07-2007 13:55:

Originally posted by n3o
Prova con:

find / -type f | xargs grep -l "login" >> list.txt

Il simbolo >> concatena ogni riga al termine del file, mentre > sovrascrive il file prima di aggiungere del contenuto

Per vedere un file senza elvis puoi:
  • cat file.txt
  • more file.txt (output paginato)


grazie! appena sono a casa provo a controllare!

ho come l'impressione che da perfetto coglione invece di cat facevo cut!:asd:

ma ho i permessi per controllare il file /ect/passwd?


Posted by n3o on 12-07-2007 14:22:

Originally posted by GiKappa
ma ho i permessi per controllare il file /ect/passwd?
Se ti autentichi come root non hai problemi di permessi :D (probabimente saranno rw-r--r--)
Originally posted by NoWhereMan
Il punto è che se mi si chiede di trovare $informazione per ogni utente, allora anche se due utenti hanno lo stesso UID, sono comunque distinti (potrebbero comunque avere home e probabilmente username diversi)
In un sistema non possono coesistere due utenti con UID uguale, credo sia stato un mageggio sul file /etc/passwd dei prof per gestire il sistema dei tempi dell'esame...
In una situazione normale non credo ci sia il problema.
In definitiva in sede di esame la situazione che mi sono trovato era di avere tre utenti diversi con UID 0 e lo script stampava lo stesso risultato per tre volte (ovviamente, il possessore di un file è localizzato tramite UID non username) e non era carino, quindi ho sistemato la situazione nel modo secondo me più efficiente... (ed è andata bene! :D ).

Sta ad ognuno risolvere i problemi estemporanei che si troverà all'esame come meglio crede (per non parlare di tutta la gente a cui si è bloccato il terminale :twisted: Salvate spesso e sperate che il demone scarichi sul disco il vostro lavoro!!!)

__________________
The answer is blowing in the wind...


Posted by NoWhereMan on 12-07-2007 14:52:

Originally posted by n3o
In un sistema non possono coesistere due utenti con UID uguale, credo sia stato un mageggio sul file /etc/passwd dei prof per gestire il sistema dei tempi dell'esame...


siccome credevo anch'io, per sicurezza ho letto man 5 passwd; UID, GID non devono necessariamente essere univoci.

in effetti ad esempio sui *BSD è presente un secondo account con privilegi di superuser (UID 0), oltre a root, cioè toor: uno dei due viene associato a una shell minimale e si usa in caso di disastri seri nel sistema. L'altro si usa per le normali attività amministrative.

comunque ignorando il trick di -uid $USERNAME stampare "utente $USERNAME" al posto dell'UID sarebbe stato complicato, e la ripetizione dello stesso "Utente N" più volte avrebbe potuto non fare un bell'effetto come dici tu :P

per non parlare di tutta la gente a cui si è bloccato il terminale :twisted:


:wall:


ciao!


Posted by antares85 on 13-07-2007 17:04:

@n3o(o chi mi sa risp): riguardo ai comandi messi in prima pagina di questo thread, non riesco a capire bene:
-esercizio trovare i file eseguibili >5k ecc... sono indispensabili i comandi xargs ls -l ; tr -s ' ' ' ' ?(questo nn ho capito bn cosa vuol dire...) ; e in cut si potrebbe eliminare -d ' '? (anche qst nn mi è chiaro)

-esercizio trovare processo che occupa + mem, non capisco perchè +7 in sort, se sia indispensabile il ps -axl (e se si perchè) all'inizio e ancora l'intero comando tr e cut che credo siano un lontano dialetto arabo/cinese per me :)

GRAZIE ANCORA!


Posted by antares85 on 13-07-2007 17:25:

visto che ci siamo, nel primo dei 2 listati lunghi, mi si può spiegare il significato di
if [ $# -ne 1 ]; then
echo "syntax: user_size <user_name>"
exit 1
fi

?


Posted by n3o on 13-07-2007 20:09:

Originally posted by antares85
visto che ci siamo, nel primo dei 2 listati lunghi, mi si può spiegare il significato di
if [ $# -ne 1 ]; then
echo "syntax: user_size <user_name>"
exit 1
fi

?
Se non passi un parametro in linea di comando genera un errore ed esce...

$# = numero argomenti in linea di comando
-ne 1 = not equal 1

La sintassi è: ./<nome_scipt> <nome_utente>

Ma in ogni caso l'ho messo se vuoi il massimo, altrimenti credo tu possa saltarlo tranquillamente. :D
Originally posted by antares85
esercizio trovare i file eseguibili >5k ecc... sono indispensabili i comandi xargs ls -l ; tr -s ' ' ' ' ?(questo nn ho capito bn cosa vuol dire...) ; e in cut si potrebbe eliminare -d ' '? (anche qst nn mi è chiaro)
Ho già analizzato il problema in un post precedente:
1) Per me un file è eseguibile se lo è per tutti (altrimenti farsi tutti i casi possibili è una macello...)
2) find / -type f -size +5 => tutti i file maggiorni di 5KB
3) xargs ls -l => per ogni file stampa le sue informazioni estese
4) grep "^-..x..x..x" => mantieni solo i file che all'inizio della riga di ls hanno il matching richiesto (. vuol dire qualsiasi carattere e ^ vuol dire inizio riga)
4) tr -s ' ' ' ' => comprimi tutti gli spazi tra le colonne in uno solo (' ' è uno spazio!)
5) cut -d ' ' -f 5,9 => estrai le colonne 5 e 9 (separate da spazio)

In toto:

find / -type f -size +5 | xargs ls -l | grep "^-..x..x..x" | tr -s ' ' ' ' | cut -d ' ' -f 5,9

Anche qui credo tu ti possa fermare al grep, magari aggiungi un more

find / -type f -size +5 | xargs ls -l | grep "^-..x..x..x" | more
Originally posted by antares85
esercizio trovare processo che occupa + mem, non capisco perchè +7 in sort, se sia indispensabile il ps -axl (e se si perchè) all'inizio e ancora l'intero comando tr e cut che credo siano un lontano dialetto arabo/cinese per me :)
sort +7 -n vuol dire "ordina numericamente (non alfabeticamente) considerando la settima colonna"
ps -alx => per far stampare più processi possibile :D (guarda il man)

Anche in questo caso gli ultimi comandi puoi saltarli, alla fine:

ps -alx | sort +7 -n | tail -1 oppure
ps -alx | sort +7 -nr | head -1 [Ho un'avversione personale ed immotivata per tail :D]

Ragazzi per ogni esercizio controllate come funziona passo per passo e poi valutate; se un comando in pipe o più servono solo per formattare meglio l'output considerate se mantenere lo stile o la semplicità!

__________________
The answer is blowing in the wind...


Posted by antares85 on 13-07-2007 20:37:

ecco non capisco come si fa a sapere da quali colonne prendere le info desiderate (sort +7 e -f 5,9, perchè proprio quelle?). c'è un qualche standard sempre uguale sul quale basarsi dove si vede ad ogni colonna quali info corrispondono?


Posted by NoWhereMan on 13-07-2007 22:03:

1) Per me un file è eseguibile se lo è per tutti (altrimenti farsi tutti i casi possibili è una macello...)


ecco una regex:
ls -l | grep '^[rw-]*x'
o anche (tenuto presente che x non compare mai all'inizio)
ls -l | grep '^[rw-]\+x' # non chiedetemi perché bisogna fare escape del + e non di *

trova tutti gli elementi della lista in cui all'inizio c'è una permutazione qualsiasi di (r,w,-) N volte seguita da un x. Il match è ovviamente al primo x trovato

naturalmente, 20 minuti solo per trovare la regex, quindi impossibile durante l'esame :D (e tra l'altro se non avessi detto tu la cosa del ls -l io starei ancora qui a smanettare con find . -perm che non va :D non mi vengono in mente altri sistemi...).

non per altro, è che ogni comando ha la sue particolari necessità di escaping quindi uno devi fare \+ un altro \{ mah...

peccato che nell'esame di LFA non ci sia un bel test di regex pratico :P


@antares85: in teoria le conti, ma occhio, perché nell'output di ps le colonne non sono sempre nello stesso numero (anche se sembra dalla formattazione) in alcuni casi hai (ad es)

code:
10 S 0 1 5 1 16 (wait) pm ? 0:00 init


(intuitiv. 10 colonne, in realtà (wait) pm sono DUE!)

in altri:
code:
10 W 0 26 5 1 16 pm ? 0:00 /usr/sbin/inet


10 colonne

o, peggio

code:
10 W 0 26 5 1 16 fs co 0:00 ps alx


intuitivamente 10 colonne, ma in realtà 11 (ps alx)

insomma una porcheria.

su linux che ho (ma stando a man sembrerebbe un'implementazione moderna comune immagino ad altri unix), ps è un po' meglio perché i campi vuoti sono contrassegnati almeno da un trattino;

nel nostro caso a parte estrarre il field del PID e in generale i primi 7 campi, dall'8 in poi si rischia :/

forse quello di minix è custom (e/o vecchio)


Posted by n3o on 13-07-2007 22:44:

pensate che in linux quel diavolo di programma per trovare i file eseguibili maggiori di 5k si risolve solo così:

find / -type f -size +5 -perm /111 o
find / -type f -size +5 -perm +111 (per versioni vecchie di find)

FINE!!! Ma il find del minix è uno scandalo :evil:

@NoWhereMan: buona la regexp, ma effettivamente non è da parte dei prof molto corretto farcele usare perchè non sono state spiegate!!!
Io sono convinto che l'esercizio incriminato loro sono convinti si possa fare con il find (ma in Minix non è vero! :evil: )

__________________
The answer is blowing in the wind...


Posted by NoWhereMan on 14-07-2007 08:15:

Originally posted by n3o
Io sono convinto che l'esercizio incriminato loro sono convinti si possa fare con il find (ma in Minix non è vero! :evil: )


mi sa che hai ragione...


All times are GMT. The time now is 05:08. Pages (39): « 1 2 3 [4] 5 6 7 8 » ... Last »
Show all 571 posts from this thread on one page

Powered by: vBulletin Version 2.3.1
Copyright © Jelsoft Enterprises Limited 2000 - 2002.