Entradas con la etiqueta ‘crontab’

Como crear copias de seguridad de una base de datos mysql 5 instalada en un servidor Linux (mysqldump + cron)

Jueves, 14 de Agosto de 2008

Para hacer copias de seguridad periódicas de una base de datos Mysql, vamos a utlizar el comando mysqldump. Este comando nos muestra en pantalla la consulta con la sql necesaria para crear de nuevo la base de datos con toda la información. Es exactemente igual que si hacemos un exportar bd a fichero desde el phpMyAdmin.

Esta instrucción única con el programador de tareas cron servirán para copiar un fichero con la sql del backup de la base de datos seleccionada a una carpeta determinada.

veamos un ejemplo de como sería la instrucción de mysqldump, suponemos tener una Base de datos llamada “BaseDeDatos”, el usuario para acceder a la base de datos es “USUARIO”, y su contraseña es “ContraseñaSegura” :

mysqldump -uUSUARIO -pContraseñaSegura –opt BaseDeDatos

con esta instrucción se nos mostraria en pantalla la sql, para redicreccionarla a un fichero, será necesario añadirle al final: “> /directorioElegido/ficheroConElBackup.sql ” quedando así:

mysqldump -uUSUARIO -pContraseñaSegura –opt BaseDeDatos > /directorioElegido/ficheroConElBackup.sql

Recordar que si estamos usando Ubuntu será necesario añadir delante del comando la palabra sudo. Tener encuenta que será necesario crear el fichero la primera vez y darle permisos de escritura. otra opción es que la carpeta destino tenga los permisos necesarios. Si necesitaramos copiar varias bases de datos, mysqldump tiene un parámetro -all que copiaría todas las bases de datos, a las que el usuario de mysql tenga acceso, en un solo fichero.

para cambiar los permisos utilizar el comando chmod, ejemplo de utilización:
chmod 777 ficheroOCarpeta
daría escritura lectura a todos los usuarios, ajustar el nivel de seguridad segun nos interese. Una vez probado que este comando nos funciona correctamente y solo falta automatizar esta instrucción para que se ejecute con la periodicidad que queramos. Para ello utilizamos el comando cron. Veamos un ejemplo:

quiero copiar cada dia a las 13:00 el contenido de la base de datos anterior:

cron 0 13 * * * 'sudo mysqldump -uUSUARIO -pContraseñaSegura –opt BaseDeDatos > /directorioElegido/ficheroConElBackup.sql’;

De este modo programamos que a las 13:00 se ejecute el comando mysqldump encargado de hacer la copia de la base de datos. Tener en cuenta que cada día se machaca el fichero que creamos con lo que sólo tenemos una única copia, la del dia anterior. Apartir de aquí se podria hacer un script que guardara todos las copias con la fecha concatenada.

Haciendo pruebas en Xubuntu server , el comando parecia ir, pero no se ejecutaba cuando tocaba. Así que tuvimos que editar manualmente el fichero del crontab, que se encuentra en /etc/crontab

sudo mousepad /etc/crontab

Añadiendo una linea al final, la misma que explicabamos antes. Veamos un ejemplo del fichero:

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don’t have to run the `crontab’
# command to install the new version when you edit this file.
# This file also has a username field, that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user command
17 * * * * root run-parts –report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || run-parts –report /etc/cron.daily
47 6 * * 7 root test -x /usr/sbin/anacron || run-parts –report /etc/cron.weekly
52 6 1 * * root test -x /usr/sbin/anacron || run-parts –report /etc/cron.monthly
89 5 13 * * * root sudo mysqldump -uUSUARIO -pContraseñaSegura –opt BaseDeDatos > /directorioElegido/ficheroConElBackup.sql
#

Como se puede ver el primer parametro es el orden de preferencia de ejecuiones poner un numero mas alto. Os quedara todo en una sola linea, aqui en el ejemplo de cae, pero debe estar en la misma linea.

El primer sintoma de este error fue el siguiente. Tratando de recuperar la lista de tareas cron -l  el sistema lanzaba un error

cron: can’t open or create /var/run/crond.pid: Permission denied
administrador@ServerTaller:~$ sudo cron -l
Password:
cron: can’t lock /var/run/crond.pid, otherpid may be 4978: Resource temporarily unavailable

El primero permision denied, se soluciona añadiendo sudo, delante del comando. Pero despues nos da el error cron: can’t lock , que nos impide ver si se ha añadido correctamente nuestra nueva tarea. así es como detectemos el problema y pues busquemos alternativas.

En windows dentro de la carpeta del mysql/bin tambien disponemos del ejecutablre mysqldum.exe, así que seguramente también se podrian hacer algo similar con el programador de tareas de windows y mysql, alquien nos lo cuenta?

Ejecutar diariamente un fichero PHP mediante crontab + wget

Lunes, 4 de Agosto de 2008

El problema de hoy es ejecutar un script php cada día a una hora determinada. Necesitamos ejecutar una consulta sql que elimine los pedidos no validados  diariamente. Explicaremos como realizar esto desde un hosting externo.

En en el caso concreo en el que estamos, queremos ejecutar cada día un fichero php alojado en nuestro servidor. Concretamente nuestro hosting posee el gestor Cpanel, desde el cual se nos ofrece una herramienta web para programar tareas. Dentro de las herramientas avanzadas disponemos del “Programador de tareas” desde el que tenemos dos modos el avanzado y el estandard.

Lo mas importante es conocer el comando que vamos a untilizar para lanzar la petición al fichero php deseado. Para usaremos wget ‘http://url-del-fichero.php’ > /dev/null ;

De este modo se lanza una peticion a la url que deseemos, es importante poner entre comillas simples la url. La parte final indica que la salida del comando wget no la necesitamos y la redireccionamos unfichero vacio. si nos interesara guardar la salida, se podria redireccionar a un fichero.

Ademas podemos hacer que cpanel envie un mail con la salida del fichero por email poniendo una dirección de email en la caja destianda a ello en la pantalla. De todos modos, en nuesto caso es aconsejable que este tipo de ficheros no tengan ninguna salida. Puesto que solo queremos actualizar la base de datos.

Modo Avanzado:

todo aquel que sea mas experto en unix, se sentirá mas comodo desde esta pantalla donde puede usar una sintaxis mas parecida a la del comando Cron de unix. Los  ‘*’  indican que se repita siempre. En el ejemplo de la figura se repetiria todos los dias, de todos los meses de todos los años a las 00:00 h. Lo que quiere decir que cada día a las 00:00 se ejecutará el comando que deseemos.

crontab avanzado de Cpanel

crontab avanzado de Cpanel

Modo Estandard:

Para los usuarios menos avanzados se puede elegir en modo estandard, donde podremos seleccionar de la lista las opciones de repeticion del intervalo. En el ejemplo se selecciona el minuto 0, la hora 3 y todos los demas se dejan pordefecto. Es curioso pero hay que dejar en día de la semana cada fin de semana, aunque la traducción no es la mas correcta, simplemente indica que tambien se repite los fines de semana, ademas de los dias de entre semana.

crontad estándard en Cpane

crontad estándard en Cpanel

Si tuvieramos acceso al servidor y este tuviera sistema operativo linux, podríamos usar los comandos propios de la consola de linux, para programar tareas como son:

  • comando cron -> sirve para ejecutar comandos de unix en intervalos regulares de tiempo períodicos. Así se podrán ejecutar comandos con la frecuencia que queramos, desde cada minuto, hasta solo unos dias concretos del año, solo los domingos, etc..
  • comando at: sirve para programar la ejecución de comandos unix en una fecha concreta, futura y puntual. Una vez estemos haciendo pruebas es importate conocer como listar las tareas que estan planificadas, mediante el comando atq, donde saldrá una lista numerada con las tareas programadas. Para eliminar cualquiera de ellas solo hay que usar el comando atrm junto el número de tarea que aparecía en el listado del comando atq.