lunes, febrero 25, 2008

Guía de Crontab

Esta guía la he sacado de la página del Rincondelprogramador.com: A veces se me chispotean como hacer los benditos crones...

crontab: Programar tareas para que se ejecuten solas cuando queramos (Linux)
Daniel Fernández Garrido


Existe en Linux una utilidad que no muchos conocen y que resulta a veces imprescindible: crontab.

crontab permite programar lo que se llaman crones, esto es, tareas que se ejecutarán en un momento determinado del tiempo de manera automática. El sistema Linux (y cualquier UNIX en general) comprueba regularmente, guiándose por el evento de reloj del sistema, si existe alguna tarea programada para ejecutarse y, en caso afirmativo, la ejecuta sin necesidad de que nadie (ningún usuario) lo haga explícitamente.

En primera instancia, algunas aplicaciones que se nos pueden ocurrir para algo así podrían ser:
  • Apagar un equipo a la hora que nosotros queramos: Por ejemplo, mientras dormimos podremos dejarlo bajando cosas de internet haciendo que se apague solo por la mañana.
  • Crear backups: Podríamos programar un cron para que, a cierta hora de ciertos días de la semana o del mes, realizase un backup de nuestros datos de manera automática, sin tener que recordar nosotros el hacerlo.
  • Poner mensajes recordatorios: Para que nos salga en pantalla una ventana recordándonos que hagamos algo que podría olvidársenos.
  • Y muchísimas otras...


La herramienta crontab nos permite programar una tarea para que se ejecute especificando:
  • La hora (0-23)
  • Los minutos (0-59)
  • El día del mes (1-31)
  • El día de la semana (0-7: tanto 0 como 7 representan al domingo)
  • El mes (1-12)


Y además en cualquiera de estos parámetros nos permitirá especificar, mediante un *, que deseamos que ocurra todos los minutos, las horas, los días del mes, los meses, o los días de la semana.

También podremos especificar listas separando mediante una coma, por ejemplo, podremos poner 1,15 en la columna del día del mes para que la tarea se ejecute cada dia 1 y 15 de mes.

Al igual que con las listas, podremos también especificar rangos mediante un guión, de manera que 1-4 en la columa del día de la semana significaría de lunes a jueves.



Los crontab's de usuario.

En un sistema Linux, cada usuario tendrá su propio crontab, incluido root. Por supuesto, en el crontab de cada usuario sólo se permitirá ejecutar tareas para las que ese usuario tenga permisos (por ejemplo, un usuario que no sea root no podrá apagar el sistema).



Manejo del comando crontab.

Para usar la funcionalidad de crontab, el comando nos ofrece, de manera básica, las siguientes posibilidades:


Ver nuestra tabla de tareas programadas

Esto lo haremos con:

$ crontab -l



Editar nuestra tabla de tareas programas

Para editar nuestras tareas cron, ejecutaremos:

$ crontab -e

...y obtendremos un editor (el que hayamos definido en la variable de entorno $EDITOR) en el que podremos añadir líneas a nuestro fichero de crontab, una por cada tarea que deseemos programar, en el formato que se explicará más abajo.


Borrar nuestra tabla de tareas programas

Podremos borrar toda nuestra programación de tareas con:

$ crontab -r




El formato de las entradas de crontab.

Cuando añadamos una entrada a nuestro crontab, lo haremos en una sola línea y con el siguiente formato:

[minutos] [hora] [día] [mes] [dia_de_semana] [comando]



Pongamos algunos ejemplos:

Para apagar el equipo a las siete y media de la mañana del 15 de febrero (ojo, hay que ser root para ejecutar esto):

30 7 15 2 * /sbin/shutdown -h now


Para hacer un .tar.gz de un directorio (como backup, por ejemplo), todos los días laborables a las 14:00:

0 14 * * 1-5 tar -czf /home/backups/backup.tar.gz /usr/importante/


Para que, cada hora, los sábados y domingos, se guarde en un fichero de log las conexiones de red abiertas en el sistema:

0 * * * 6,7 date >> /var/log/net_con.log; netstat -t >> /var/log/net_con.log



...Como se puede ver, es súmamente fácil de manejar y muy potente.

Cuando el rm -R no funciona!!! =-S

Estuve "pariendo" estos días para borrar unos archivos porque no podía eliminarlos por un error que me decía que era una cadena larga de caracteres... Fue todo un dolor de cabeza porque me estaba realmente quedando sin disco. La solución fue esta:

find carpetaparaborrar -type f -exec rm -rf '{}' \;

Y listo... pero, a su vez necesitaba antes de eliminar todos los archivos innecesarios, respaldar los que realmente necesitaba en otro directorio... Esto con la finalidad de evitar confusiones... Entonces esto fue lo que hice: uní el comando para mover los archivos de un directorio con el anterior, de la siguiente manera:

cp *.extension dir-origen/ dir-destino/ & find carpetaparaborrar -type f -exec rm -rf '{}' \;

Y lo guarde en /usr/bin/ y lo llamé respdiario. El resultado fue el siguiente:

/usr/bin/respdiario

#! /bin/bash
cp *.extension dir-origen/ dir-destino/ & find carpetaparaborrar -type f -exec rm -rf '{}' \;

Luego de guardar el archivo, simplemente le di los permisos correspondientes:

chmod 755
/usr/bin/respdiario

Y listo!!!

Tip: procuren utilizar directorios homogéneos para cualquier usuario, a menos que sean ustedes los únicos usuarios... esto con la finalidad de que si otro usuario utiliza el recurso, funcione en los directorios que tienen en común y no con directorios exclusivos de la sesión de usuario...

Guía para empaquetar y desempaquetar archivos en linux

La verdad es que nunca me acuerdo como es el asunto de empaquetar y desempaquetar archivos, así que posteo esta guía. No es de mi autoría, proviene de Badopi, pero badipi esta offline para la fecha de creación de esta entrada, así que la conseguí de una de esas páginas viejas que uno guarda por ahí.

* Ficheros tar
Empaquetar: tar -cvf archivo.tar /dir/a/comprimir/
Desempaquetar: tar -xvf archivo.tar
Ver contenido tar -tf archivo.tar

* Ficheros gz
Comprimir: gzip -9 fichero
Descomprimir: gzip -d fichero.gz

* Ficheros bz2
Comprimir: bzip fichero
Descomprimir: bzip2 -d fichero.bz2

gzip ó bzip2 sólo comprimen ficheros [no directorios, para eso existe tar]. Para comprimir y archivar al mismo tiempo hay que combinar el tar y el gzip o el bzip2 de la siguiente manera:

* Ficheros tar.gz
Comprimir: tar -czfv archivo.tar.gz ficheros
Descomprimir: tar -xzvf archivo.tar.gz
Ver contenido: tar -tzf archivo.tar.gz

* Ficheros tar.bz2
Comprimir: tar -c ficheros | bzip2 > archivo.tar.bz2
Descomprimir: bzip2 -dc archivo.tar.bz2 | tar -xv
Ver contenido: bzip2 -dc archivo.tar.bz2 | tar -t

* Ficheros zip
Comprimir: zip archivo.zip ficheros
Descomprimir: unzip archivo.zip
Ver contenido: unzip -v archivo.zip

* Ficheros lha
Comprimir: lha -a archivo.lha ficheros
Descomprimir: lha -x archivo.lha
Ver contenido: lha -v archivo.lha
Ver contenido: lha -l archivo.lha

* Ficheros arj
Comprimir: arj a archivo.arj ficheros
Descomprimir: unarj archivo.arj
Descomprimir: arj -x archivo.arj
Ver contenido: arj -v archivo.arj
Ver contenido: arj -l archivo.arj

* Ficheros zoo
Comprimir: zoo a archivo.zoo ficheros
Descomprimir: zoo -x archivo.zoo
Ver contenido: zoo -L archivo.zoo
Ver contenido: zoo -v archivo.zoo

* Ficheros rar
Comprimir: rar -a archivo.rar ficheros
Descomprimir: rar -x archivo.rar
Ver contenido: rar -l archivo.rar
Ver contenido: rar -v archivo.rar