Acelerar la carga del terminal borrando logs en Ubuntu

9 02 2012
Terminal

Por lo general, al iniciar alguna consola o terminal bash, se leen muchos archivos de configuración por defecto y se abren archivos para guardar los eventos de actividad que van ocurriendo. Aunque es útil, puede ralentizar un poco la carga del terminal.

Normalmente, cuando un sistema lleva mucho tiempo en ejecución o ha pasado bastante tiempo desde que fue instalado por primera vez, se acumulan bastantes logs de actividad de diferentes procesos.

Logrotate es una buena utilidad, activada por defecto en la mayoría de distribuciones para los archivos más importantes y que generan mayor volumen de información. Es muy útil porque ademas comprime los logs y los borra pasado un tiempo.

El problema, es que no todas las configuraciones por defecto de logrotate suministradas por la distribución, pueden resultar útiles para todos los usuarios.

Aunque se puede optar por personalizar logrotate para los archivos necesarios, muchas veces se desconocen cuales son todos los archivos de logs o resulta demasiado tedioso ir configurando todos, incluso aunque utilices sistemas automatizados como Puppet.

De ahí la necesidad de crear un pequeño script de bash, más radical (bajo responsabilidad del usuario) que previo respaldo de todos los logs en el home, borre todos los archivos de log más antiguos que una determinada fecha dada en días y tambien borre archivos rotados con logrotate.

Lo he llamado zerolog y este es código que realiza esas tareas:

?Descargar zelolog.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/usr/bin/env bash
 
#    zerolog is a bash script for delete common logs on /var/log and
#    avoid fill the disk with rotated files. It backups previously
#    the logs on home folder and it can preserve logs older than
#    a date given on days. This is useful for avoid slow sessions
#    starts on bash terminals.
 
#    Copyright (C) 2012 by Ángel Guzmán Maeso, shakaran at gmail dot com
 
#    This program is free software; you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation; either version 3 of the License, or
#    (at your option) any later version.
 
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
#    GNU General Public License for more details.
 
#    You should have received a copy of the GNU General Public License
#    along with this program; if not, write to the Free Software
#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
usage(){
    echo 'Usage: $0 [DAYS]'
    echo 'DAYS: Remove logs older than DAYS. Default: 0 days'
    exit 1
}
 
if [ `/usr/bin/id -u` -ne 0 ]; then
    echo 'Please, run this script as root'
    usage
fi
 
if [ -z "$1" ]; then
    MTIME_DAYS=''
else
    MTIME_DAYS='-mtime +$1'
fi
 
echo Currently logs size: `du -hs /var/log/ | awk {'print $1'}`
echo 'Backup the log folder on home'
tar zcPf ~/logs-`date '+%m-%d-%y-%H:%M:%S'`.tar.gz /var/log
 
echo 'Removing rotated log files'
find /var/log/ -type f $MTIME_DAYS -name *.gz -exec rm -rf '{}' \;
 
echo 'Emptying the logs'
for logs in `find /var/log $MTIME_DAYS -type f`; do > $logs; done
 
echo Currently logs size: `du -hs /var/log/ | awk {'print $1'}`

El script esta subido a github en:

https://github.com/shakaran/scripts/blob/master/zerolog.sh

Por si alguien quiere hacer fork, modificarlo o en un futuro hago nuevas modificaciones. Esta licenciado bajo GPLv3.

Ejemplos de uso

Para usarlo, requiere ser administrador, ya que no todos los logs pueden borrarse como usuario regular.

Puede usarse como:

1
$ sudo ./zerolog.sh

Que borrará todos los logs rotados y vaciara existentes, ademas de crear un backup previo en el home del tipo logs-<FECHA>.tar.gz con la fecha actual de la ejecución. Por si quieres conservar los logs o decides restaurarlos por algún motivo.

Si quieres borrar sólo los más antiguos de X días, por ejemplo los más antiguos de hace una semana:

1
$ sudo ./zerolog.sh 7

Incluso puedes crearte un alias zlog:

1
$ alias zlog="sudo sh /ruta/zerolog.sh"

También puedes añadir el script como una tarea cron y que se ejecute a diario, por ejemplo:

1
$ sudo crontab -e

Y añadir:

1
0 0 * * * sh /ruta/zerolog.sh > /dev/null 2>&1

Por otro lado, si te importan poco tus logs o quieren guardar solo los más recientes, puedes optar por una opción más drástica como:

1
0 0 * * * find /var/log/ -type f -mtime +7 -exec rm -rf '{}' \;&nbsp;> /dev/null 2>&1
VN:F [1.9.17_1161]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.17_1161]
Rating: 0 (from 0 votes)


Automatizar actualizaciones con yum-updatesd y yum-cron en CentOS

23 12 2011
Actualizaciones automáticas

CentOS es una distribución de las consideradas como más estables. Aunque sea bastante estable, no implica que no necesite de actualizaciones con regularidad debido a incidencias críticas en algún paquete de software o bien debido avulnerabilidades.

Para evitar consumir tiempo a los administradores de sistemas comprobando regularmente si se necesita alguna actualización, existen herramientas que se encargan de realizar esta tarea de forma períodica.

Existen dos alternativas en CentOS:

  • yum-updatesd es un demonio notificador de actualizaciones que puedan ser aplicadas al sistema
  • yum-cron es un paquete con los archivos necesarios para hacer que el comando yum update se establezca como un trabajo de cron.

Generalmente yum-updatesd es más recomendable para escritorios y yum-cron para servidores, por este motivo coexisten ambos.

yum-cron es algo más sencillo pero no dispone de muchas opciones de configuración, aunque yum-updatesd es más configurable, pero parece tener algunas fugas y acumulaciones de memoria/CPU cuando se ejecuta durante bastante tiempo en servidores.

Configurando yum-updatesd

Podemos instalarlo con:

1
# yum install yum-updatesd

yum-updatesd dispone de varios métodos de notificación:

  • syslog
  • email
  • dbus

Estas notificaciones se configuran mediante el archivo de configuración /etc/yum/yum-updatesd.conf. Este archivo dispone de una única sección “main” que define todas las opciones de configuración globales. Las opciones disponibles son las siguientes:

  • run_interval Número de segundos a esperar entre comprobaciones de actualizaciones disponibles.
  • updaterefresh Número mínimo de segundos entre para actualizar la información de actualizaciones para evitar acceder al servidor con demasiada frecuencia.
  • emit_via Lista de maneras para emitir una notificación de actualización. Los valores válidos son: ‘email’, ‘dbus’ y ‘syslog’.
  • do_update Opción booleana para decidir si las actualizaciones deberían ser o no aplicadas. Por defecto falso.
  • do_download Opción booleana para decidir si las actualizaciones deberían o no ser descargadas automáticamente. Por defecto falso.
  • do_download_deps Opción booleana para automáticamente descargar las dependencias de paquetes que necesitan actualizarse también. Por defecto falso.

Opciones de notificacion por email

  • email_to Lista de direcciones email para enviar las actualizaciones de notificación. Por defecto ‘root@locahost’.
  • email_from Direcciones de email desde donde enviar las notificaciones de actualización. Por defecto ‘yum-updatesd@localhost’.
  • smtp_server Servidor SMTP para usar en el envío de email, cadena de host o host:puerto. Por defecto ‘localhost:25′.

Opciones de notificacion por Syslog

  • syslog_facility La instalación de syslog que debería ser usada. Por defecto ‘DAEMON’.be used. Defaults to ‘DAEMON’.
  • syslog_level Nivel de los mensajes en syslog. Por defecto ‘WARN’.

Ejemplo de configuración

Un ejemplo de configuración posible para /etc/yum/yum-updatesd.conf donde cada 8 horas comprobamos actualizaciones sin instalarlas, pero descargandolas y notificamos si existe alguna por email puede ser:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[main]
# how often to check for new updates (in seconds)
run_interval = 28800
 
# how often to allow checking on request (in seconds)
updaterefresh = 3600
# how to send notifications (valid: dbus, email, syslog)
emit_via = email
# should we listen via dbus to give out update information/check for
# new updates
dbus_listener = yes
# who to send the email notifications to
email_to = tuemail@tudominio.com
# who send the notifications
email_from = yumupdates@tudominio.com
# automatically install updates
do_update = no
# automatically download updates
do_download = yes
# automatically download deps of updates
do_download_deps = yes

Después de configurar el servicio, lo iniciaremos con:

1
# service yum-updatesd start

Y para que se inicie en cada inicio del servidor:

1
# chkconfig yum-updatesd on

Para desactivar es realizar la operación inversa a yum-updatesd:

1
2
#service yum-updatesd stop
#chkconfig --del yum-updatesd

Nota: Recuerda que una vez desactivado no se notificará ningún tipo de actualización, y debe por tanto realizarse de forma manual.

Configurando yum-cron

yum-cron se habilita como si fuera cualquier otro daemon:
1
2
3
# yum install yum-cron
# yum chkconfig yum-cron on
# service yum-cron start

Esto creara un archivo /etc/cron.daily/0yum.cron que será ejecutado diariamente a la hora programada.

Aunque se trata como daemon, en realidad no lo es, sino que es un script que se ejecuta diariamente y limpia las actualizaciones semanalmente. Es fácil comprobar con chkconfig –list que yum-cron esta en la lista, pero desahabilitado para todos los niveles de ejecución. Puede activarse si se desea con:

1
# chkconfig yum-cron on
Este paso no es necesario ya que cron ejecutara igualmente la tarea programada.
Si es necesario iniciar por primera vez yum-cron para que se cree el archivo en cron-daily con un flag en /var/lock/subsys/yum-cron:
1
# /etc/init.d/yum.cron start

Nota: Es importante recalcar que algunos paquetes como los del kernel requieren de reinicio para aplicar las nuevas actualizaciones y yum-updatesd y yum-cron no implican reiniciar el sistema, por lo que recae esta ultima atencion al administrador del sistema.

VN:F [1.9.17_1161]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.17_1161]
Rating: 0 (from 0 votes)


Solucionar: RuntimeWarning: Python C API version mismatch for module en CentOS 5.5 con cPanel

26 11 2010

Si utilizas CenOS y por ejemplo has decidido hacer una actualización de tu versión de Python ya que puede que estuvieras usando la versión 2.4 o 2.6 y quieres actualizar a 2.6 o 2.7 respectivamente, puede ser que te encuentres el error siguiente al ejecutar yum:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# yum
/usr/lib/python2.6/site-packages/rpm/__init__.py:7: RuntimeWarning: Python C API version mismatch for module _rpm: This Python has API version 1013, module _rpm has version 1012.
  from _rpm import *
There was a problem importing one of the Python modules
required to run yum. The error leading to this problem was:
   No module named sqlitecachec
Please install a package which provides this module, or
verify that the module is installed correctly.
It's possible that the above module doesn't match the
current version of Python, which is:
2.6.5 (r265:79063, Jun  4 2010, 21:43:07)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-48)]
If you cannot solve this problem yourself, please go to
the yum faq at:
  http://wiki.linux.duke.edu/YumFaq

Este error se debe, a que yum, esta buscando sus bibliotecas para ejecutarse y no las encuentra. Posiblemente por que tu versión de yum esta instalada en otra versión de python anterior y la nueva no tiene dicha versión.

Existen varias formas de solucionar esto, pero en CentOS no esta documentada y a fecha de hoy en google no puedes encontrar ninguna solución. Es más acudiendo al IRC de centos pidiendo ayuda, su respuesta liberal en ingles fue “Date una bofetada o directamente disparate en la cabeza por lo que has hecho“.

Esta respuesta me indigno mucho, sobre todo porque me pareció pésimo el soporte, que sin darme solución, encima me respondía de esa forma, aparte el problema realmente reside en que ellos no son capaces de solucionártelo y puesto que no actualizan la versión de python en años “para que sea estable“, los usuarios y sysadmin deben ingeniárselas solucionando los problemas.

Luego después de experimentar mis soluciones fueron las siguientes:

- Reinstalar yum a traves de rpm: esto probablemente funcionaría, pero no, ya que se instalaría incorrectamente con la nueva versión de python y no conseguí hacer nada, quizás hice mal algún paso.

- Reinstalar el paquete yum-metadata-parser que contiene las dependencias de yum. Igualmente al reinstalarlo no tuvo efecto ya que estaría cogiendo una mezcla de paths.

- Modificar la variable de entorno PYTHONPATH. De igual forma no funciono ni poniendo versiones más antiguas.

La solución final, que aunque fue cutre, conseguí hacerlo funcionar, fue la siguiente:

Buscar el binario de yum:

1
# which yum

En mi caso la salida fue:

1
2
# which yum
/usr/bin/yum

Luego tras comprobar que el tipo del archivo era un script en python:

1
2
# file /usr/bin/yum
/usr/bin/yum: python script text executable

Me fije en el archivo para editarlo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# cat /usr/bin/yum
#!/usr/bin/python
import sys
try:
 import yum
except ImportError:
 print >> sys.stderr, """\
There was a problem importing one of the Python modules
required to run yum. The error leading to this problem was:
 
 %s
 
Please install a package which provides this module, or
verify that the module is installed correctly.
 
It's possible that the above module doesn't match the
current version of Python, which is:
%s
 
If you cannot solve this problem yourself, please go to 
the yum faq at:
 http://wiki.linux.duke.edu/YumFaq
 
""" % (sys.exc_value, sys.version)
 sys.exit(1)
 
sys.path.insert(0, '/usr/share/yum-cli')
try:
 import yummain
 yummain.user_main(sys.argv[1:], exit_code=True)
except KeyboardInterrupt, e:
 print >> sys.stderr, "\n\nExiting on user cancel."
 sys.exit(1)

Si os fijáis, nuestro error se da en este preciso archivo, ya que falla una excepción con el ImportError. Y en la primera línea tenemos un:

1
#!/usr/bin/python

Basta con cambiar esa línea para decirle al script que ejecute una versión antigua de python (la que funcionaba) de nuestro sistema. Es decir, cambiar (en mi caso a python 2.4):

1
#!/usr/bin/python2.4

Y listo, yum funcionará sin problemas. Obviamente, con un mejor análisis de la situación, se podría hacer que yum cogiera realmente la última versión de python y sus bibliotecas (probablemente por el path), pero eso requiere de mayor trabajo y tiempo y para mí esta solución fue valida. Sin embargo, si alguien esta dispuesto a comentar una mejor solución, estaré agradecido.

VN:F [1.9.17_1161]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.17_1161]
Rating: 0 (from 0 votes)