Pagina 3 di 7

Re: find_external_SlackPkg_files.sh: uno script per maniaci

Inviato: mer 28 set 2011, 13:54
da targzeta
Aggiornato lo script. Sono passato a sort+comm, effettivamente l'esecuzione è migliorata di moltissimissimo. Il nuovo script e il vecchio mi hanno dato gli stessi identici output. Quindi ora rimane solo da sistemare il problema con i link ed eventualmente fare un post-processo dei dati.

Con questo metodo si è anche risolto il problema con il comando '['.

Fatemi sapere,
Emanuele

Re: find_external_SlackPkg_files.sh: uno script per maniaci

Inviato: gio 29 set 2011, 10:10
da targzeta
Ecco i nuovi dati. Li ho fatti a PC appena avviato, quindi senza l'ausilio dell'eventuale cache.

Codice: Seleziona tutto

file trovati e installati:
 109620  109659 4807338 found_files.s
 120551  126501 5011788 installed_files.s
 230171  236160 9819126 totale

tempo find:
real    0m23.800s
user    0m1.050s
sys     0m0.910s

tempo sort dei due file:
real    0m0.920s
user    0m1.190s
sys     0m0.080s

tempo comm:
real    0m0.335s
user    0m0.300s
sys     0m0.000s
Non c'è proprio paragone, in una trentina di secondi ho gli stessi risultati che prima ottenevo in quasi mezz'ora.

Emanuele

Re: find_external_SlackPkg_files.sh: uno script per maniaci

Inviato: gio 29 set 2011, 13:36
da targzeta
Sto pensando a come risolvere il problema dei link alle directory. Ci sono almeno tre modi:
  • gestire solo alcuni casi particolari e noti
  • gestire solo i casi particolari creati dal pacchetto aaa_base
  • cercare di fare una cosa generica e che vale sempre
I casi noti sono:

Codice: Seleziona tutto

/usr/share/{doc,info,man,pkgconfig}
I casi particolari gestiti da aaa_base dipende appunto da aaa_base, ma di solito comprende:

Codice: Seleziona tutto

/usr/share/{doc,info,man}
più qualcos'altro (si noti l'assenza di pkgconfig).

Se però si vuole fare qualcosa di più generico si dovrebbero controllare tutti i link simbolici creati dai vari pacchetti. La lista dei link simbolici va comunque creata, però se vogliamo implementare questo algoritmo si deve fare un ciclo del tipo:

Codice: Seleziona tutto

for file in $(<symbolic_links); do [ -d $file ] && reapl_path=$(readlink -m $file); done
c'è da dire che:
  • sul mio PC per fare tutto questo ciclo ci mette meno di un secondo e quindi mi sembra una soluzione ancora accettabile. Però il mio PC, come si vede anche dal numero di file trovati da find, è un sistema abbastanza minimale.
  • questi controlli sono fatti dopo la 'find' e quindi buona parte dei dati sugli inode, se non tutti, sono ancora in cache.
Suggerimenti?
Emanuele

Re: find_external_SlackPkg_files.sh: uno script per maniaci

Inviato: gio 29 set 2011, 20:20
da targzeta
Ok, ho:
  • migliorato la ricerca dei link simbolici. Questo evita il problema dei file bash e altri che non venivano trovati.
  • tramite un analisi post-processo ora:
    • ho risolto il problema dei link simbolici a directory (usando il 'for' di cui al post precedente).
    • faccio la prune di tutto l'albero di directory lasciando solo la directory madre.
Allego qui una RC dello script, non è molto commentato (è una RC!!!) per chi volesse fare da beta tester. In particolare mi servirebbe:
  • una 'diff' tra i due output forniti dallo script attuale e dall'RC.
  • la differenza di performace ritornata dal comando 'time'. In questo caso però bisognerebbe eseguire il comando due volte e prendere i tempi della seconda volta perché altrimenti il risultato è sfalsato (la prima find impiega molto più tempo).
Consiglio di usare almeno questo file di filtraggio '~/.find_external_SlackPkg_files':

Codice: Seleziona tutto

/usr/share/fonts/*/fonts.dir           mkfontdir
/usr/share/fonts/*/fonts.scale         mkfontscale
/usr/share/fonts/*/encodings.dir       mkfontdir
/home
/mnt
/opt
/tmp
/usr/share/mime                        update-mime-database
/var/cache/fontconfig                  fc-cache
/var/cache/ldconfig                    ldconfig
/var/tmp/kdecache-*                    kde-mv
Grazie a chiunque volesse contribuire,
Emanuele

Re: find_external_SlackPkg_files.sh: uno script per maniaci

Inviato: ven 30 set 2011, 10:50
da ZeroUno
C'è qualche problema nelle due sed finali. Mi ci hanno impiegato 8 minuti l'una e includevano anche ls /opt (che è tra gli exclude path).
La prima sed ha una espressione da 79000 caratteri mentre la seconda è di 91000.

Comunque l'output finale è sceso da 200000 righe 3000 righe ;-)

Re: find_external_SlackPkg_files.sh: uno script per maniaci

Inviato: ven 30 set 2011, 11:26
da targzeta
Sisi, ci ho pensato un po' ed effettivamente non "mi garbano". Inoltre in teoria non funzionerebbero lo stesso per via dei link multipli alla stessa directory. Vedo di fare qualcosa di meglio è più veloce. Ho un'idea ma devo vedere come si comporta.

Ma quei 3000 percorsi sono corretti, sono tutti percorsi esterni? Come mai così tanti? Io ne ho si è no una 20 di righe di output.

Emanuele

Re: find_external_SlackPkg_files.sh: uno script per maniaci

Inviato: ven 30 set 2011, 12:08
da ZeroUno
spina ha scritto:Sisi, ci ho pensato un po' ed effettivamente non "mi garbano". Inoltre in teoria non funzionerebbero lo stesso per via dei link multipli alla stessa directory. Vedo di fare qualcosa di meglio è più veloce. Ho un'idea ma devo vedere come si comporta.
in quella sed togli quello che sta negli exclude path e stai a posto, credo
Ma quei 3000 percorsi sono corretti, sono tutti percorsi esterni? Come mai così tanti? Io ne ho si è no una 20 di righe di output.
Sembrerebbe che siano corretti.
Ti ricordo che tu hai un sistema minimale. Io una installazione completa della 13.1, continuamente aggiornata a current con slackpkg (che lascia diversi file di conf .orig), più diversi pacchetti slacky particolari (in particolare le compat32-library che ha la lib/incoming che chiaramente non è gestita dallo script), più programmi installati non pacchettizzati (anche parecchia roba da cpan o da pacchetti proprietari). Altre cose che si potrebbero mettere negli exclude file e poche cose che non ci dovrebbero stare.


Sarebbe opportuno che
1) l'output venisse sparato direttamente in un file anzichè in standard output.
2) in coda si aggiungesse l'elenco degli exclude path
Cosa bella sarebbe anche che a fianco delle directory (e anche degli exclude path) dal momento che è stato tranciato il contenuto venisse almeno mostrato il numero di file al suo interno.

Io intanto per debug ho tolto gli rm e rinominato i due temp_output in temp_output.1 e .2 (idem per temp_output.s).


Matteo

Re: find_external_SlackPkg_files.sh: uno script per maniaci

Inviato: ven 30 set 2011, 12:30
da targzeta
ZeroUno ha scritto:Sarebbe opportuno che
1) l'output venisse sparato direttamente in un file anzichè in standard output.
dai, questo no. Se uno vuole un '> file' non ci mette niente a farlo. Quando io eseguo lo script, in genere analizzo l'output. Ora, a me sono poche righe, ma anche un '| more' non ci vuole niente a farlo.
ZeroUno ha scritto:2) in coda si aggiungesse l'elenco degli exclude path
Lo script ha una opzione '-f' che mostra i path filtrati ed esce. Con '-h' ti mostra l'help (sto pensando di gestire anche '--help').
ZeroUno ha scritto:Cosa bella sarebbe anche che a fianco delle directory (e anche degli exclude path) dal momento che è stato tranciato il contenuto venisse almeno mostrato il numero di file al suo interno.
Ecco, lo sapevo io. Prima mi chiedi di troncare il contenuto delle directory e poi mi chiedi di mostrare il numero di file :). Per quelli fatti a run-time è facile, però per quelli esclusi no, mi costringi ha fare un find anche negli exclude path. Tieni conto che gli exclude path servono anche a velocizzare lo script saltando alberi di directory.
ZeroUno ha scritto:Io intanto per debug ho tolto gli rm e rinominato i due temp_output in temp_output.1 e .2 (idem per temp_output.s).
Ti allego l'ultimo RC su cui sto lavorando. Mi dici com'è messo questo con i tempi? Ho dovuto modificare l'algoritmo perché c'erano errori logici. Se due link simbolici puntano alla stessa directory (e succede) allora lo script sed ha nella sua linea di comando due RE uguali ma che fanno cose diverse. Questo vuol dire che non controllo tutti i link. Quest'ultimo RC dovrebbe essere corretto, però non so quanto ci mette per eseguirlo, a me il tutto è molto rapido.

Emanuele

Re: find_external_SlackPkg_files.sh: uno script per maniaci

Inviato: ven 30 set 2011, 14:03
da targzeta
Ho visto che la RC3 è stata scaricata. Allego quindi la RC5, quella che probabilmente sarà la finale. Il controllo dei link simbolici è veramente palloso, io poi vorrei sapere perché i pacchetti ufficiali installano i file sotto link simbolici. Pensavo che almeno il team di sviluppo della Slackware avesse una sua linea di gestione delle directory.

Emanuele

Re: find_external_SlackPkg_files.sh: uno script per maniaci

Inviato: ven 30 set 2011, 21:23
da targzeta
Questa RC invece è una prova per vedere se è più veloce fare 'comm | awk + comm' ma con la prima comm che manda meno dati a awk oppure fare un'unica 'comm | awk' ma con la comm che manda molti più dati da analizzare ad awk. Pura statistica, a me risulta più veloce la seconda.

Quale accendiamo?
Emanuele

Re: find_external_SlackPkg_files.sh: uno script per maniaci

Inviato: sab 1 ott 2011, 2:35
da ZeroUno
non ero io ad averli scaricati :-D.
Li tiro giù e ti dico.

Re: find_external_SlackPkg_files.sh: uno script per maniaci

Inviato: sab 1 ott 2011, 2:58
da ZeroUno
conteggio effettuato al secondo lancio (il primo lancio la find ha impiegato un minuto c.a.)

Codice: Seleziona tutto

# time bash find_external_SlackPkg_files.rc3.sh > rc3.out
comm: file 1 is not in sorted order
comm: file 1 is not in sorted order

real    0m21.413s
user    0m15.698s
sys     0m6.151s

# time bash find_external_SlackPkg_files.rc5.sh > rc5.out
comm: file 1 is not in sorted order
comm: file 1 is not in sorted order

real    0m17.839s
user    0m11.865s
sys     0m6.079s

# time bash find_external_SlackPkg_files.rc6.sh > rc6.out
comm: file 1 is not in sorted order
comm: file 1 is not in sorted order

real    0m17.408s
user    0m11.689s
sys     0m5.880s
perchè quei due warning?

i tre out sono identici, ma diversi da quello di ieri (al netto di file aggiunti oggi), che effettivamente era bacato. dosemu dava un po' di fastidio.
in > l'output di ieri
in < quello di ora

Codice: Seleziona tutto

< /etc/ppp/peers/tmpwvdial
---
> /etc/ppp/peers/usr/share/dosemu/drive_z/tmpwvdial
165c171
< /etc/ppp/tmpoptions
---
> /etc/ppp/usr/share/dosemu/drive_z/tmpoptions
512,513d517
< /etc/tmpresolv.conf
< /etc/tmpwvdial.conf
519a524,525
> /etc/usr/share/dosemu/drive_z/tmpresolv.conf
> /etc/usr/share/dosemu/drive_z/tmpwvdial.conf
537d542
< /etc/wvdial.conf
662,663c667,668
< /usr/X11R6.bak/
< /usr/X11R6/
---
> /usr/X11R6R6.bak/
> /usr/X11R6R6/
2161d2164
< /var/spool/cron/cron.F79hxl/
3118,3119c3120,3121
< /var/spool/cups/tmp/gs_JCqGr5
< /var/spool/cups/tmp/gs_wA2RsW
---
> /var/spool/cups/usr/share/dosemu/drive_z/tmp/gs_WiGgZ0
> /var/spool/cups/usr/share/dosemu/drive_z/tmp/gs_sY3t08
Altre parti variano solamente per l'ordine.

Però adesso devo rilanciarlo senza escludere la /opt ma lì ho sia roba pacchettizzata sia roba non pacchettizzata.
# find /opt/|wc -l
72633

Re: find_external_SlackPkg_files.sh: uno script per maniaci

Inviato: sab 1 ott 2011, 10:46
da targzeta
Diciamo che tra l'rc5 e l'rc6 vince ancora l'rc6. Tu come la vedi, 17 secondi sono accettabili? Ho chiesto anche a Procopio di farmi una prova analoga, vediamo se ci riporta qualcosa anche lui.

Anche l'output, se non ho capito male, sembra migliorato ulteriormente, no? La differenza sembra che ieri non ripristinava i link, mentre quelli di oggi si. Ad esempio:

Codice: Seleziona tutto

512,513d517
< /etc/tmpresolv.conf
< /etc/tmpwvdial.conf
519a524,525
> /etc/usr/share/dosemu/drive_z/tmpresolv.conf
> /etc/usr/share/dosemu/drive_z/tmpwvdial.conf
Ma questo file:

Codice: Seleziona tutto

537d542
< /etc/wvdial.conf
da quale dei due viene trovato. L'output suggerisce che gli script di oggi non lo trovano mentre quello di ieri sì, o il contrario? Il file di cron credo sia normale che ci sia solo in uno, dovrebbe essere un job.

Dobbiamo trovare il motivo di quei warning di comm, probabilmente se l'input fosse ordinato ci impiegherebbe meno (voglio passare '--nocheck-order' a comm). Dovrebbe darlo il comm della riga 252 dell'RC6. Fai una prova, mettici prima di quella righa, questo:

Codice: Seleziona tutto

echo "$real_path"
e dopo un check:

Codice: Seleziona tutto

(( $? != 0 )) && exit
quando lo script termina, controlla il file subset.s.

Grazie mille davvero,
Emanuele

P.S. Per curiosità, ma lo script attuale (occhio che l'ho modificato ieri) quanto ci mette? Anche se è ovvio che tira fuori un sacco di file in più.

:edit: Forse ho capito. Alla riga 248, sempre dell'RC6, sostituisci:

Codice: Seleziona tutto

sed -n -i "/${real_path////\\/}\//{s;${real_path}/;${file}/;;w subset.s
con:

Codice: Seleziona tutto

sed -n -i "/^${real_path////\\/}\//{s;${real_path}/;${file}/;;w subset.s
(nota il '^' davanti a '${real_path'.

Re: find_external_SlackPkg_files.sh: uno script per maniaci

Inviato: sab 1 ott 2011, 12:21
da Procopio
ecco i tempi sui tre script: l'originale, rc5 e rc6. Lo script originale sul mio sistema trova 5.489 files, l'ho eseguito da root.

Codice: Seleziona tutto

.

real    0m0.033s
user    0m0.000s
sys     0m0.002s

.rc5.

real    0m0.003s
user    0m0.000s
sys     0m0.002s

.rc6.

real    0m0.002s
user    0m0.001s
sys     0m0.001s

questi due comandi non restituiscono nulla entrambi:

Codice: Seleziona tutto

root@darkstar:/tmp# diff find. find.rc5.
root@darkstar:/tmp# diff find.rc5. find.rc6.
root@darkstar:/tmp#


se però li scrivo interi restituiscono un bel po di roba:)

Codice: Seleziona tutto

root@darkstar:/tmp# diff find_external_SlackPkg_files.sh find_external_SlackPkg_files.rc5.sh 
168c168
< _check_extern_program comm find mktemp rm sed sort uniq
---
> _check_extern_program awk comm find mktemp readlink rm sed sort uniq
178c178
<           exit
---
>           exit 0
219c219
< find / -mindepth 1 \( $path_to_prune \) -prune -o -print > found_files
---
> find / -mindepth 1 \( $path_to_prune \) -prune -o \( -type d -printf "%p/\n" \) -o -print | sort >  found_files.s
226d225
< # - eliminare lo slash finale delle directory (find non lo inserisce)
228c227
< sed -sn '/^\.\//b print;d;:print n;/^install\//{n;b print};s/^/\//;s/\/$//;p;/\.new$/{s/\.new$//;p};b print' /var/log/packages/* > installed_files
---
> sed -s -n '/^\.\//b print;d;:print n;/^install\//{n;b print};s/^/\//;p;/\.new$/{s/\.new$//;p};b print' /var/log/packages/* > installed_files
231c230,231
< sed -n '/ cd.*; ln /{s/ \+/ /g;s/^ *//;s;\([^ ]* \)\{2\}\([^ ]*\) \([^ ]* \)\{4\}\([^ ]*\) .*;/\2/\4;p;}' /var/log/scripts/* >> installed_files
---
> awk '/^[^#]* cd .*; *ln /{sub(/\/$/,"",$3); if ( match($7,/^\//) ) print $7; if ( $8 == "." ) { sub(/\/$/,"",$7); sub(/.*\//,"/",$7); print "/" $3 $7} else print "/"$3 "/" $8}' /var/log/scripts/* | sort | uniq > symbolic_links.s
> cat symbolic_links.s >> installed_files
240d239
< sort found_files > found_files.s
242c241,263
< comm -23 found_files.s installed_files.s
---
> comm -23 found_files.s installed_files.s | awk 'BEGIN { row = "" }{ if ( row == "" || ! match(row, "/$") || ! match($0, "^" row) ) { print $0; row = $0 } }' > temp_output
> 
> comm -13 found_files.s installed_files.s > not_found_files.s
> for file in $(<symbolic_links.s)
> do
>     if [ -h $file -a -d $file ]
>     then
>       real_path=$(readlink -m $file)
>       sed -n -i "/${real_path////\\/}\//{s;${real_path}/;${file}/;;w subset.s
>                                              ;d};p;" temp_output
>       if [ -s subset.s ]
>       then
>           comm -23 subset.s not_found_files.s > subset.tmp
>           if [ -s subset.tmp ]
>           then
>               sed -i "/${file////\\/}/s;$file;$real_path;;" subset.tmp
>               cat subset.tmp >> temp_output
>           fi
>       fi
>     fi
> done
> 
> sort temp_output

Codice: Seleziona tutto

root@darkstar:/tmp# diff find_external_SlackPkg_files.rc5.sh find_external_SlackPkg_files.rc6.sh 
241c241
< comm -23 found_files.s installed_files.s | awk 'BEGIN { row = "" }{ if ( row == "" || ! match(row, "/$") || ! match($0, "^" row) ) { print $0; row = $0 } }' > temp_output
---
> comm -3 --output-delimiter=$'\t' found_files.s installed_files.s | awk -F '\t' 'BEGIN { row = "" }{ if ( match($0, "^\t") ) { print $2 >> "not_found_files.s" } else { if ( row == "" || ! match(row, "/$") || ! match($0, "^" row) ) { print $0; row = $0 } } }' > temp_output
243d242
< comm -13 found_files.s installed_files.s > not_found_files.s

Re: find_external_SlackPkg_files.sh: uno script per maniaci

Inviato: sab 1 ott 2011, 12:29
da targzeta
Procopio ha scritto:ecco i tempi sui tre script: l'originale, rc5 e rc6. Lo script originale sul mio sistema trova 5.489 files, l'ho eseguito da root.

Codice: Seleziona tutto

.

real    0m0.033s
user    0m0.000s
sys     0m0.002s

.rc5.

real    0m0.003s
user    0m0.000s
sys     0m0.002s

.rc6.

real    0m0.002s
user    0m0.001s
sys     0m0.001s

questi due comandi non restituiscono nulla entrambi:

Codice: Seleziona tutto

root@darkstar:/tmp# diff find. find.rc5.
root@darkstar:/tmp# diff find.rc5. find.rc6.
root@darkstar:/tmp#
C'è qualcosa che non va. I tempi sono troppo bassi ed il primo diff dovrebbe restituire qualcosa. Sei sicuro che i file 'find.rc?.' contengano righe? Secondo me è successo qualche errore durante l'invocazione.

Emanuele