-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Hola:
Una de las peculiaridades de los sistemas de ficheros en linux es que, si
se borra un fichero que está abierto, el fichero se borra en el
directorio, pero en realidad no se borra hasta que el proceso que lo tiene
abierto lo suelte. El inodo queda guardado en el kernel.
Así, cuando el YOU hace una actualización de algún rpm, si el demonio que
se ha actualizado no se reinicia, lo que se sigue ejecutando es la versión
antigua, y no se borra del disco efectivamente hasta el reinicio del
servicio.
Lo curioso es que con el comando "lsof" se pueden encontrar esos inodos
pendientes, porque contiene la palabra "RPMDELETE" o "path inode=" y son
identificables.
He aquí un pequeño script que publicaron en la lista de seguridad (algo
modificado por mi) y que permite localizar esos procesos. Queda adivinar
cual es el servicio correspondiente, pero eso es fácil.
Se supone que funciona al menos en las versiones 9.x de SuSE, en la 10.x
no lo he probado. En la 7.3 también funciona.
#!/bin/bash
#/usr/local/bin/rpm_pending
# Check there are no processes using software that has been updated by rpm.
# Date: Tue, 10 Jan 2006 10:14:59 +0000 (GMT)
# From: Bob Vickers
# Subject: Re: [suse-security] Patch Noifications
# PATH=/bin:/usr/bin
set -o nounset
#if [ $# -eq 1 ]
#then
# lines=$1
#else
# lines=10
#fi
# Run lsof and scan the output for libraries that have been updated. Before
# SuSE 9.1 these will include the string RPMDELETE, but in 9.1 they include
# a semi-colon.
# In 9.2 and 9.3 they include the string 'path inode='
#
# Ejecutar lsof y explorar la salida buscando librerías actualizadas.
# Antes de SuSE 9.1 ésta contendrá la frase RPMDELETE, pero en 9.1
# incluyan un punto y coma.
# En 9.2 y 9.3 incluyen la frase 'path inode='
# Dos versiones: la primera sólo saca las primeras n lineas (como
# parámetro al comando) - reactivar el párrafo de código arriba también
# La otra simplemente lo vuelca todo (mi variación y la que he dejado)
#procs=`lsof | grep -E 'RPMDELETE|;|path inode=' | head -$lines`
procs=`lsof | grep -E 'RPMDELETE|;|path inode=' `
if [ -n "$procs" ]
then
host=`hostname`
cat <