martes, 21 de septiembre de 2010

Tareas programadas con Cron

Al poco tiempo de empezar a tratar con un servidor Linux te das cuenta de que tarde o temprano vas a utilizar una tarea programada. Puede ser que necesites realizar una copia de seguridad cada X tiempo, vaciar una cola de correos, o simplemente controlar que todo está en su sitio.

Sabía desde hace tiempo que algún día hablaría con Don Cron. Llevábamos una temporada mirándonos a la cara, con tono desafiante. Aún conociéndole de oídas, me ha impresionado la potencia y las opciones disponibles de este demonio.

Quién es Cron, y donde lo puedo encontrar

Cron se encarga de ejecutar las tareas programadas que se configuren en el sistema. Probablemente, y aunque depende de tu distribución Linux, en /etc encuentres varios directorios llamados cron.hourly, cron.daily, cron.weekly, cron.monthly. En estos directorios se encuentran los scripts que se ejecutan cada hora, cada día, cada semana, etc...

Uso básico de Cron

Si dejáramos un script en cualquiera de estos directorios se ejecutaría en el momento que proceda. Por ejemplo, si creamos un script que realice una copia de seguridad de nuestros archivos y lo colocamos en cron.daily, este script se ejecutará una vez al día.

Uso avanzado de Cron

Tal vez el uso de los directorios cron.* no satisface nuestras necesidades de configuración para la tarea que queremos programar. En este caso programaremos las tareas a través del archivo crontab.

Esta es, dadas las posibilidades que ofrece, la forma más interesante de utilizar Cron. El archivo en cuestión se encuentra en el directorio /etc, y tiene un formato parecido a este:

SHELL=/bin/sh
PATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin
MAILTO=root
#
# check scripts in cron.hourly, cron.daily, cron.weekly, and cron.monthly
#
-*/15 * * * * root test -x /usr/lib/cron/run-crons && /usr/lib/cron/run-crons >/dev/null 2>&1


Pasemos a explicar cada una de las partes de este archivo. En primer lugar las primeras cuatro líneas, que contienen variables para Cron.

SHELL, la cual nos indica el shell con el que se ejecutarán las órdenes de Cron. En caso de no asignar valor o de no existir la variable, se tomará el shell del usuario que ejecuta Cron.

PATH, contiene o indica la ruta a los directorios en los cuales cron buscará el comando a ejecutar. Este path es distinto al path global del sistema o del usuario.

MAIL TO es a quien se le envía la salida del comando (si es que este tiene alguna salida). Cron enviará un correo a quien se especifique en este variable, es decir, debe ser un usuario válido del sistema o de algún otro sistema. Si no se especifica, entonces cron enviará el correo al usuario propietario del comando que se ejecuta.

HOME es el directorio raíz o principal del comando cron, si no se indica entonces, la raíz será la que se indique en el archivo /etc/passwd correspondiente al usuario que ejecuta cron.

Tras las líneas con las variables entramos en materia, y empezamos a econtrarnos con líneas de ejecución de tareas. cada una de estas líneas tiene un formato parecido a este:

minutos | horas | día-mes | mes | día-semana | usuario | script

40 * * * * root /etc/scripts/tareaProgramada1.sh

En la primera parte de la linea tenemos la definición del momento en que se ejecutará la tarea.En caso de tener un * en alguno de los campos, significará que se ejecutará la tarea para cada uno de los valores posibles. De esta forma en el ejemplo el script se ejecutará en el minuto 40 de cada hora, cada día de cada semana de cada mes.

El siguiente campo de la línea especifica el usuario que ejecutará el script, y después tenemos la ruta donde tenemos el script que queremos ejecutar. Tendremos que tener en cuenta que el script tiene asignado el permiso de ejecución, y que el usuario que lo tiene que ejecutar tiene permisos sobre el archivo.

Configuración del tiempo de ejecución

Una de las ventajas de Cron es la posibilidad de configurar el momento exacto en que se ejecutará una tarea. Las posibilidades son prácticamente infinitas, por lo que vamos a ver unos ejemplos que nos harán tenerlo más claro.

- Aparte de ejecutar una tarea en un momento concreto, también podemos ejecutarla cada X tiempo. Para esto podemos utilizar la /. Veamos un ejemplo.

15 */2 2/3 * * root /etc/scripts/tareaProgramada1.sh

En este ejemplo el script se ejecutará en el minuto 15 de cada 2 horas, cada 3 días a partir del día 2 de cada mes. La primera ejecución será el próximo día 2 a las 0:15. Hay que tener en cuenta que si no especificamos el incio para el periodo de repetición Cron tendrá en cuenta el primer valor válido. Con */2 se tomará como inicio la hora cero. Con 2/3 se contará de tres en tres, a partir del 2.

- En el caso de que lo necesitemos, también podemos especificar los valores concretos en que queremos configurar la ejecución de la tarea. Utilizando la , podemos dar varios valores a un campo del tiempo de ejecución.

15 7,14 * * * root /etc/scripts/tareaProgramada1.sh

La tarea se ejecutará a las 7:15 y las 14:15 de cada día.

- Podemos también configurar el día de la semana en que se ejecutará la tarea. Nos valdría si lo que queremos es lanzar un proceso muy largo y necesitamos que no haya nadie, por ejemplo el fin de semana. Para el día de la semana podemos utilizar números (del 0 al 7), o con las tres primeras letras del día en inglés. Si se usan numeros hay que tener en cuenta que tanto el 0 como el 7 es el domingo.

15 7 * * sun root /etc/scripts/tareaProgramada1.sh
15 7 * * 7 root /etc/scripts/tareaProgramada1.sh
15 7 * * 0 root /etc/scripts/tareaProgramada1.sh

Con estas tres lineas ejecutaremos la tarea a las 7:15 del domingo.

- Otra opción interesante es configurar un rango de valores para los que se ejecutará la tarea. Utilizaremos el - entre dos valores para especificar un rango. Vamos con un ejemplo.

15 7-14 * * 7 root /etc/scripts/tareaProgramada1.sh

En el ejemplo ejecutaremos la tarea los domingos, en el minuto 15 de 7 a 14 horas. La primera ejecución será a las 7:15 y la última a las 14:15.

- Ahora, si combinamos las diferentes formar de configurar una tarea, podemos ver casos como este:

*/15 8-18/2 10 5 sat root /etc/scripts/tareaProgramada1.sh

La tarea se ejecutará cada 15 minutos, entre las 8 de la mañana y las 6 de la tarde cada dos horas, el día 10 de mayo, siempre que ese día sea sábado.

Este ejemplo sirve para entender que las tareas se ejecutarán sólo si se cumple cada una de las condiciones especificadas. Es posible que tarde años en llegar un sábado 10 de mayo (el último fue en 2008), por lo que hay que tener bastante claro que las condiciones que configuremos tengan algo de sentido.

Ahora ya sabemos programar tareas en nuestro Linux, y lo mejor de todo es que esto es sólo una parte de las cosas que puede hacer Cron. Seguro que volvemos a vernos.

miércoles, 23 de junio de 2010

Acceso SSH a ESXi

Después de unos meses tratando con máquinas virtuales y demás, llegó la hora de actuar.

En su día comenté que la mayor parte del trabajo se centraría en Xen, pero los problemas que han aparecido son acerca de una máquina virtual de VMWare. La cuestión es que de un día para otro la máquina ha dejado de funcionar, y ahora nos toca, almenos, averiguar lo que ha pasado.

Probablemente en la mayoría de los casos con la consola del ESXi tengamos suficiente, pero cuando las cosas se ponen feas una de nuestras mejores opciones será la de habilitar el acceso al ESXi a través de SSH para poder ver "desde dentro" lo que está pasando. Es tan fácil como:

Desde la consola de ESXi
  1. Pulsar ALT + F1 para acceder al shell. Se muestra una pantalla negra.
  2. escribir unsupported.
  3. escribir la contraseña del usuario root del ESXi.
  4. En el directorio /etc se encuentra el archivo de configuración del servicio inetd, inetd.conf. Lo editamos.
  5. Descomentamos las lineas del archivo que hacen referencia al servicio SSH.
  6. Rearrancamos inetd. Podemos

A partir de este momento podremos acceder al ESXi directamente a través de SSH y trabajar sobre él.

Me ha parecido interesante también la opción de realizar tareas a través del navegador, accediendo a la dirección IP del ESXi, pero esa es otra historia que contaremos en otro momento.

jueves, 25 de marzo de 2010

Partir una memoria usb flash

Como no paro de tener problemas con los discos duros (gracias windows, gracias subidas de tensión) he tenido que utilizar mucho más de lo que me gustaría ese gran programa llamado HDD Regenerator.

La utilidad de esta aplicación está fuera de toda duda, me ha ayudado a seguir utilizando discos que habían empezado a dar errores serios, pero este no es el tema. La cuestión es que las últimas veces que he utilizado esta aplicación ha sido desde Windows, recuperando el segundo disco del sistema.

Ésta última vez me tocó utilizarlo en el disco principal, por lo que no era posible ejecutar desde Windows, al estar cargado el SO en ese mismo disco y la aplicación necesitar acceso total al mismo. Ante este panorama me tocó decidir si grabar un CD y arrancar desde él o utilizar mi querido pendrive (8GB) para ello.

HDD Regenerator tiene la opción de crear un disco USB de arranque, por lo que es algo automático y muy fácil. Tan sólo tuve que mover los archivos que tenía en la memoria para recuperarlos después. El problema vino cuando en vez de 8GB el pendrive sólo tenía una capacidad de 1,92GB. ¿Qué ha pasado?



Al parecer HDDRegenerator sólo necesitaba 1,92GB de espacio, por lo que creó una partición con ese tamaño, dejando sin asignar el resto de la capacidad de la memoria. A pesar de no fiarme del particionador de Windows, traté de eliminar la partición y crear una nueva con el máximo espacio disponible. No pudo ser, claro.

En este momento es cuando me acordé de una aplicación que ya había utilizado antes para trabajar sobre memorias flash. Se llama SwissKnife, y a pesar de ser freeware vale su peso en oro.

Recuperar el estado inicial de la memoria es tan fácil como hacer un formateo completo (full) del mismo, con con que tendremos una sola partición con el total del tamaño disponible.





SwissKnife ofrece más características, por lo que me parece un software muy recomendable si tenemos una memoria USB de un tamaño considerable. En la página de descarga se puede obtener más información acerca de esta aplicación. A mi, de momento, me ha salvado de darme de cabezazos, o de reiniciar para arrancar en Linux, que ya es bastante.

jueves, 18 de febrero de 2010

Virtualicemos el mundo

Hace tiempo que no escribo en el blog, y la verdad es que si lo hago es porque se trata de un tema más que interesante: la virtualización.

El caso es que hace no mucho he empezado a pelearme y experimentar con Xen, tras un fugaz paso por VMware. El resultado no puede ser más satisfactorio, aunque como es normal, al ser novato, se me escapan miles de cosas que se aprenden poco a poco.

Espero que poco a poco tenga la posibilidad de escribir en el blog las cosas que vaya aprendiendo. De momento parece que Xen y yo vamos a ser amigos...