dimarts, 20 / febrer / 2007

Comptar el nombre de fitxers oberts per un programa en Linux

No és gaire comú, però a vegades és necessari veure si estem obrint massa cops un únic fitxer. Per exemple, un cas que ens va passar en una aplicació: ens vam despistar i obríem fitxers de log massa sovint, com ens van dir la gent encarregada de sistemes. Però no ens van dir com comprovar-ho. Així que em vaig haver de crear un script per poder comprovar si ho estàvem arreglant o no.

L'script es basa la comanda lsof que mostra els fitxers oberts (veure el for al codi). La línia més important del codi és, precisament, la del for, en concret la comanda que s'executa `lsof -c $program -F pn\n | cut -c 2- | tail -n+2 | sort`, la resposta de la qual la fa servir el for per iterar. Aquí van alguns comentaris:
  • El paràmetre -c proces fa que mostri noms els fitxers oberts per un cert procés (per exemple podria ser 'java').
  • La part -f pn\n fa que apareguin pid del procés (amb una 'p' davant) seguit dels noms dels fitxers (amb una 'f' davant)
  • El cut -c 2- elimina la primera columna de carcters (la p i les n)
  • El tail -n+2 elimina la primera fila (el pid)
  • El sort ordena el que queda, i així podem anar comptant.


#!/bin/bash
#######################
# Mostra els cops que un fitxer est obert per un cert programa
# -per filtrar els .log, per exemple afegir: | grep "\.log"
#######################

function mostraHelp
{
echo Mostra els cops que un fitxer est obert per un cert programa
echo ""
echo "Us: $0 [--help|programa] ";
}

if [ "$1" == "--help" ]; then
mostraHelp;
exit;
else
program=$1;
fi

fitxer_anterior=""
count=1
primer=1
total=0


if [ "$1" != "" ]; then
for f in `lsof -c $program -F pn\n | cut -c 2- | tail -n+2 | sort`
do
let total=$total+1;
if [ "$fitxer_anterior" == "$f" ]; then
let count=$count+1;
else
if [ "$primer" == "0" ]; then
echo -e $count $"\t" $fitxer_anterior
let count=1
fitxer_anterior=$f;
else
primer=0;
fitxer_anterior=$f;
fi
fi
done
echo -e $count $"\t" $fitxer_anterior
echo -e $"\n" Total: $total;
else
mostraHelp;
exit;
fi

0 comentaris: