Individuare le librerie non usate: unusedlibs.sh (Linux)…
Lavorare nel mondo embedded significa doversi muovere in ambienti con risorse limitate, talvolta molto risicate.
Linux (inteso come distribuzione) non fa eccezione, specie se si parte con una installazione “base” da customizzare in seguito.
In altri termini, presto o tardi si comincia ad aver bisogno di spazio per cui si deve eliminare qualcosa, partendo ovviamente dal superfluo.
In questo caso vediamo un modo abbastanza grezzo ma efficace per ottenere un elenco di librerie non usate e quindi potenzialmente eliminabili.
Lo script seguente, da lanciare il prima possibile durante la fase di boot del sistema, sfrutta il sottosistema di notifica degli eventi inotify di Linux (precisamente il tool inotifywait che fa parte degli inotify-tools) per tener traccia di tutti gli accessi alle librerie dovuti al caricamento dei programmi.
Il funzionamento è semplice: all’avvio viene lanciato lo script, che rimarrà attivo per un tempo predefinito (120 secondi, modificabili) e poi chiuderà inotifywait.
Dopo una pulizia a colpi di sort & uniq, l’elenco delle librerie usate verrà confrontato con l’elenco di tutte le librerie installate: le librerie “non usate” verranno scritte nel file dei risultati.
Il codice
# FILE : unusedlibs.sh
# AUTHOR : Gian Paolo "JP" Ghilardi
# LICENSE : GPL v2.0 (only)
# PURPOSE : uses inotify subsystem to detect unused libraries
# USAGE : insert this script in a bootup one and wait for its ouput
#
# TESTED ON :
# - Linux, x86 32-bit, Bash 3.2.39(1)-release
# REFERENCES:
# [1]: http://en.wikipedia.org/wiki/Inotify
# [2]: http://linux.die.net/man/1/inotifywait
#! /bin/bash
LIBPATHS="/usr/lib" # lib paths to monitor (i.e. "/usr/lib /lib")
ODIR=/var/log # output directory
TIME=120 # time before stopping inotifywait
USED=$ODIR/used.lst # inotifywait output
ALL=$ODIR/all.lst # all libraries in $LIBPATHS
RES=$ODIR/unusedlibs.txt # results
logger UNUSEDLIBS "Looking for used libs (${TIME}s)..."
rm -rf $RES
inotifywait -m -r -e ACCESS $LIBPATHS > $USED & # detect every access to libs in $LIBPATHS
IPID=$!
sleep $TIME
kill $IPID # kill inotifywait
sort $USED | uniq | grep .so | awk '{print $1$3;}' > $USED
find $LIBPATHS -type f -iname "*.so*" | sort > $ALL
# save the name of each library that is not in $USED but is in $ALL
while read line; do
if [ -z $(grep $line $USED) ]; then
echo $line >> $RES
fi
done < $ALL
rm -rf $ODIR/*.lst
logger UNUSEDLIBS "Job done. Output in: $RES Entries: $(wc -l $RES)"
L’esempio dal vivo
Per lanciare lo script unusedlibs.sh ho creato uno script di avvio, start-unusedlibs.sh.
Ho quindi creato un link simbolico in /etc/rc2.d/ (testato su Debian Lenny) in modo che start-unusedlibs.sh venga eseguito in fase di boot.
Dopo 120 secondi, aumentabili secondo necessità (nel mio caso entro questo periodo viene lanciato praticamente tutto quel che mi serve, quindi posso fermare inotifywatch), in /var/log comparirà il file unusedlibs.txt con l’elenco delle librerie potenzialmente non usate.
Poi, con molta calma e attenzione (magari facendo più test), si può pensare di rimuovere manualmente le librerie davvero superflue…
PS: casomai vi interessasse, credo che questo genere di giochetto credo sia possibile anche in .Net/Windows, ad esempio sfruttando la classe FileSystemWatcher…


Commenti Recenti