Editando archivos en uso

Leyendo el manual de rsync(1), en la documentación de la opción --inplace avisa de que:

In-use binaries cannot be updated (either the OS will prevent this from happening, or binaries that attempt to swap-in their data will misbehave or crash).

Resulta que hace un tiempo había intentado hacer un programa que modificara su propio binario para guardar datos (sin ningún motivo concreto), pero resultaba en errores al modificar el propio archivo mientras aún estaba en uso, además es posible (en sistemas POSIX) eliminar archivos en uso. La lectura de la opción de antes encendió una bombilla, he aquí ese programa que modifica su binario para guardar un número, lo hace continue.

Script para limpiar zombies

Toma como parámetro el id del proceso que generó los zombies y usa GDB para hacer waitpid, lo más seguro es que haga falta root :/

#!/usr/bin/env bash
# Kills zombie process spawning from a parent PID

# check parameter number
if [ -z "$1" ];then
    echo "$0 <zombie parent pid>"
    exit 0
fi

# assign reasonable names to variables
ppid=$1
fname=`tempfile`

# GDB instructions
(for zpid in `ps h --ppid=$ppid|grep -P '^\s*\d+\s+[^ ]+\s+Z'|awk '{print $1;}'`;do
    echo "print waitpid($zpid, 0, 0)" # wait for each zombie
 done
 # and detach
 echo "detach") > $fname

# launch GDB
gdb -batch -p $ppid /proc/$ppid/exe -x $fname

# and cleanup
rm $fname

Recuperando un archivo eliminado pero abierto por otro proceso

Hoy, hace escasos 10 minutos estaba limpiando el disco, así que me dirijí a la carpeta de vídeos y... ¡raaaaca!, 20 archivos a alimentar la bestia del espacio libre. Pero al ver los archivos que habían sobrevivído a la limpieza sobrevino la preocupación sobre el paradero de uno de ellos, y es que quizá al fin y al cabo saltarse el paso de la papelera de reciclaje no fuera buena idea.

El problema era que me había cargado una película que tenía pensado compartir y con más bien pocos seeders, así que tocaba recuperarlo. Por suerte el transmission seguía abierto y seedeando, así que aún había esperanza, al fin continue.

Escribiendo un salvapantallas para Gnu/Linux [C]

Los salvapantallas son algo que siempre me llamó poderosamente la antención pero hasta hace poco no sabía como se escribían, hoy aprenderemos a hacer uno para el XScreensaver de Gnu/Linux.

El primer paso es hacernos con el archivo vroot.h del xscreensaver (si hacemos apt-get source xscreensaver nos lo encontraremos en el directorio utils/ [o aquí]), y meterlo en el mismo directorio en el que desarrollaremos el resto del código. vroot.h es un archivo (bajo licencia de estilo BSD) usado comunmente para tomar al ventana_raíz, en la que tenemos que escribir si, por ejemplo, queremos hacer un salvapantallas.

Empezamos entonces con nuestro archivo, lo llamaremos salvapantallas.c y empezamos con el código, continue.

Editing files in place

Reading the rsync(1) manpages, the option --inplace doc­u­men­ta­tion alerts of:

In-use binaries cannot be updated (either the OS will prevent this from happening, or binaries that attempt to swap-in their data will misbehave or crash).

Some time ago I tried to write a program which would modify it's own binary to save data (without a specific motivation), but it resulted in errors when modifing it's binary while in use, also, it's possible (in POSIX systems) to delete files used in that moment. The read of the option above showed a viable path to do this, so here is the program which modifies it's own binary to save a number, continue.

Previous »