# rm-rf.es | Administración de sistemas

Bitácora personal de un SysAdmin Gnu/Linux, Windows, BSD...

[error] (28)No space left on device: mod_python: Failed to create global mutex

Ayer en un servidor Apache con mod_python me encontré con este error:

[Thu Jun 02 21:43:19 2011] [error] (28)No space left on device: mod_python: Failed to create global mutex 1 of 4 (/tmp/mpmtx280211).
Configuration Failed

Lo primero que hice por lógica fue mirar lo siguiente:

  1. Mirar que el disco tuviera espacio libre (df -h).
  2. Mirar que el disco no estuviera al 100% en inodos (df -i).
  3. Mirar que ningún log de Apache hubiera llegado a los 2.0GB de tamaño.

Ninguna de las tres cosas era cierta y seguía teniendo el problema. Hace ya un par de años tuve un problema similar en Apache y estaba relacionado con los semáforos del Kernel: Apache: Semget: No space left on device. Esa vez la solución que ofrecía era vaciar el array de semáforos. En este caso vamos  solucionarlo de otro modo, ampliando los valores de Kernel para los semáforos. Actualmente tenía los siguientes:

# cat /proc/sys/kernel/sem
250	32000	32	128

Los ampliamos y reiniciamos Apache:

# echo "kernel.sem = 512 32000 100 512" >> /etc/sysctl.conf
# sysctl -p
# /etc/init.d/httpd restart

 

Servidor web en Python con un solo comando

Python es un lenguaje de programación extremadamente potente y sus módulos nos pueden hacer la vida muy fácil en determinadas situaciones. En este caso podemos levantar un servidor web sin ningún tipo de instalación ni configuración, únicamente tenemos que ejecutar el siguiente comando en la ruta que queramos compartir vía web:

# python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...

Automáticamente tendremos un servidor web levantado en el puerto 8000 de todas las IPs que escuchan en nuestro equipo (y en localhost por supuesto: http://localhost:8000) a través del cual se podrán procesar peticiones GET y HEAD estándar.

$ netstat -a | grep 8000
tcp        0      0 *:8000                  *:*                     LISTEN

Para un apaño rápido o para compartir cosas entre PCs puede ser muy útil en determinados momentos. El módulo utilizado es SimpleHTTPServer.

Python Imaging Library “IOError: decoder jpeg not available”

Últimamente me ha tocado montar y administrar un par de servidores en los que las aplicaciones corren en Python. Uno de ellos necesitaba la librería de gestión de imagenes PIL de Python (Python Imaging Library), por lo que procedí a instalarla del modo que hacemos cualquier instalación de módulos Python. Descargar e instalar:

tar -xzvf Imaging-1.1.6.tar.gz
cd Imaging-1.1.6
python setup.py install

El fallo fue no ejecutar antes de instalar el módulo los test que te informan si todas las dependencias se cumplen correctamente:

python setup.py build_ext -i
python selftest.py

Entonces, el desarrollador de la aplicación confirmó que algo extraño sucedía. No había problema para gestionar imágenes .gif o .png, pero todo tratamiento de imagenes .jpg terminaban en fallos de imagen corrupta y diversos errores.

Investigando esta fuente, me dispuse a ejecutar los tests que comentaba anteriormente y efectivamente el fallo era que no existía decodificador para jpeg:

IOError: decoder jpeg not available

Procedí a instalarlo desde los repositorios de CentOS:

yum install libjpeg.i386 libjpeg-devel.i386

Tras hacerlo seguía fallando, y era debido a que era necesario reinstalar el módulo de Python PIL para que encontrara las rutas a las librerías correspondientes de libjpeg. Fue necesario eliminar completamente PIL y volverlo a instalar, sino no funciona:

rm -rf /usr/lib/python2.4/site-packages/PIL/
rm -f /usr/lib/python2.4/site-packages/PIL*

A partir de aquí, reinstalé el módulo y podemos observar que los test funcionaron correctamente:

$ python setup.py build_ext -i
$ python selftest.py
57 tests passed.
$ python setup.py install

Python: Cambiar codificación (encoding) por defecto

Python, por defecto trae una codificación en ascii, lo que probablemente os generará problemas y dolores de cabeza a la hora de utilizar caracteres con tilde o especiales como la “ñ”. El típico error es así:

UnicodeEncodeError: ‘ascii’ codec can’t encode character u’\u2014′ in position 14: ordinal not in range(128)

Podéis comprobar la codificación por defecto de python desde la consola python:

>>> import sys
>>> sys.getdefaultencoding()
'ascii'

Para modificar la codificación, simplemente cread un fichero llamado “sitecustomize.py” dentro de la carpeta “site-packages” de python (por ejemplo en mi instalación está en /usr/lib/python2.4/site-packages, y añadir al fichero el siguiente contenido (dependiendo de la codificación que queráis):

import sys
sys.setdefaultencoding('iso-8859-15')