Demonio de Planificación Fcron

TÍTULO:			Demonio de Planificación Fcron
VERSIÓN LFS:	3.3 (o superiores, con cambios menores)
AUTOR:			Robert Park <feztaa@shaw.ca> (originalmente por
				Lyle Vogtmann <vogtmann@pioneernet.net>)
TRADUCTOR:	Proyecto LFS-ES

SINOPSIS:
	Cómo configurar el demonio de planificación de tareas fcron en
	un sistema LFS.

RECETA:

Historial de modificaciones
---------------------------

Revisión 1.5  2002/06/09 04:14:05  feztaa
Añadidas algunas notas, cambiado el estilo de los bloques de código y
corregidos un par de errores tipográficos.

Revisión 1.4  2002/05/02 00:05:36  feztaa
Arreglado un problema con el guión cronmail que entregaba el correo
incorrectamente, clarificadas algunas ambigüedades y reducidas algunas
redundancias en los fcrontabs.

Revisión 1.3  2002/04/27 19:28:08  feztaa
Arreglados algunos errores tipográficos y otros errores gramaticales
(oops ;)

Revisión 1.2  2002/04/27 19:17:48  feztaa
He asumido el mantenimiento de esta receta de Lyle.
Añadido el guión 'cronmail', actualizados los guiones de arranque a LFS
3.3 y reformateado el aspecto de la receta.

Introducción
------------

Escribí esto para ayudar a otros a configurar y usar el sustituto del
Cron de Vixie, conocido como fcron. Cron es un muy útil y casi
omnipresente demonio en sistemas de tipo Unix. Se inicia en el arranque
y se ejecuta en el fondo, iniciando tareas programadas especificadas en
un fichero "crontab". Hay muchas versiones de cron disponibles, cada una
con sus propias adiciones y características. Fcron tiene una mezcla de
algunas de las mejores características.

Fcron puede funcionar como un cron estándar, ejecutando tareas a una
hora determinada en un día determinado. También puede funcionar como
anacron, ejecutando tareas después de un cierto periodo de tiempo a una
hora no especificada (si no mantienes encendido tu ordenador todo el
tiempo, esto es un regalo llovido del cielo). También puede ejecutar
tareas después de un tiempo determinado respecto al tiempo que el
sistema lleva encendido.

Para más información, consulta la página principal de fcron en
http://fcron.free.fr.

Notas
-----

En un intento de hacer esto más fácil de leer, todos los "bloque de
código" que deberías ejecutar en la línea de comandos empiezan y
terminan con un "##--CÓDIGO--##". Eres libre de copiar éso en la línea
de comandos con el mismo código, no dañará nada. Además, en el texto
citado (la salida de un programa, por ejemplo), cada línea se sangrará
con cuatro espacios.

Requisitos
----------

Si quieres ver la salida de los comandos que ejecuta Fcron, querrás
tener un sistema de correo funcional instalado. Si no estás interesado
en instalar un sistema de correo en tu sistema, he escrito un guión
"cronmail" que puedes utilizar para permitir a fcron enviarte correo sin
un Agente de Transporte de Correo (MTA - Mail Transport Agent) completo
en tu sistema. Aunque necesitarás instalar el paquete procmail, ya que
el guión cronmail utiliza formail (que viene con procmail).

Esta receta no cubre cómo configurar un servicio de correo local, pero
te mostraré cómo instalar cronmail. Si quieres configurar un servicio de
correo local, consulta el TLDP-ES en http://lucas.hispalinux.es (LDP en
inglés en http://www.linuxdoc.org). Te recomiendo Postfix,
http://www.postfix.org.

Instrucciones
-------------

1. Obtén el código fuente de fcron de http://fcron.free.fr y
desempaquétalo. Yo utilizo fcron 2.9.0, pero esta receta también debería
funcionar para otras versiones.

2. Añade el usuario y el grupo a tu sistema:

##--CÓDIGO--##
groupadd -g 13 fcron
useradd -u 13 -g fcron -d /dev/null -s /bin/false fcron
##--CÓDIGO--##

Esto crea el grupo fcron con el número de identificación de grupo (GID)
13 y el usuario fcron con el número de identificación de usuario 13.
También evita que alguien pueda entrar en el sistema utilizando esta
cuenta, ya que su directorio principal es /dev/null y su intérprete de
comandos es /bin/false.

3. Ejecuta configure:

##--CÓDIGO--##
./configure --prefix=/usr --with-spooldir=/var/lib/fcron
##--CÓDIGO--##

Esto ordena a fcron poner sus ficheros fcrontab en /var/lib/fcron. Yo,
personalmente, utilizo /var/fcron pero, si quieres cumplir la norma FHS,
tienes que utilizar /var/lib/fcron.

4. Podrías querer echar un vistazo al fichero config.h para hacer
cualquier cambio al proceso de construcción pero, por propia
experiencia, es innecesario. Si editas este fichero, asegúrate de
comprobar la localización de los ficheros clave, como fcron.allow,
fcron.deny, etc. Además, puedes configurar a qué programa llama Fcron
cuando te envía un correo, si quieres.

5. Compila:

##--CÓDIGO--##
make && su -c "make install"
##--CÓDIGO--##

Esto compilará el código fuente y lo instalará como administrador
(root). Cuando te pregunta si quieres instalar el guión de inicio,
contesta que no. Vamos a hacer nosotros mismos más adelante uno mejor.

7. Si estás actualizando, asegúrate de ejecutar este comando para cada
usuario de tu sistema que tenga un fichero fcrontab durante la
instalación:

##--CÓDIGO--##
fcrontab -u <usuario> -z
##--CÓDIGO--##

Esto, simplemente, actualiza el fichero fcrontab, en el caso de que el
formato haya cambiado.

8. Ahora crea los guiones de arranque. Ejecuta esto como administrador
(root):

##--CÓDIGO--##
cat >/etc/rc.d/init.d/fcron <<"EOF"
#!/bin/bash
# Begin $rc_base/init.d/fcron

source /etc/sysconfig/rc
source $rc_functions

case "$1" in
  start)
    echo "Iniciando fcron..."
    loadproc /usr/sbin/fcron
    ;;

  stop)
    echo "Deteniendo fcron..."
    killproc fcron
    ;;

  restart)
    $0 stop
    sleep 1
    $0 start
    ;;

  status)
    statusproc fcron
    ;;

  *)
    echo "Usage: $0 {start|stop|restart|status}"
    exit 1
    ;;
esac

# End $rc_base/init.d/fcron
EOF
chmod 755 /etc/rc.d/init.d/fcron
##--CÓDIGO--##

Además, necesitarás hacer los enlaces simbólicos en los directorios
apropiados. Hice los mío como sigue, pero podrías querer hacerlo
de manera diferente:

##--CÓDIGO--##
cd /etc/rc.d/rc0.d &&
ln -s ../init.d/fcron K35fcron &&
cd /etc/rc.d/rc6.d &&
ln -s ../init.d/fcron K35fcron &&
cd /etc/rc.d/rc3.d &&
ln -s ../init.d/fcron S60fcron
##--CÓDIGO--##

9. Ahora necesitas darle algunas tareas para realizar (¡si no, no sería
muy útil!). Lee la página del manual (man) de fcrontab:

##--CÓDIGO--##
man 5 fcrontab
##--CÓDIGO--##

Si necesitas algunos ejemplos para comenzar, esto es lo que tengo en el
fcrontab del administrador (root): (esto es la salida de 'fcrontab -l')

    !mailto(feztaa),mail(yes),forcemail(yes),noticenotrun(yes)
    %daily * 9-15 updatedb --prunepaths="/mnt /proc /dev"
    %daily * 9-15 logreport

Este fichero fcrontab es bastante sencillo. Primero, fijamos algunas
opciones: enviar el correo a feztaa (yo), siempre enviar correo (sin
importar qué) y notificar si el comando no se ejecutó. Entonces,
ejecutamos updatedb cada día entre las 9 AM y las 3 PM. Finalmente,
ejecutamos logreport a la misma hora en la que updatedb se ejecuta
(logreport sólo es un rápido guión de bash que escribí para explorar mis
ficheros de registro y notificarme las entradas al sistema del
administrador [root]).

En mi propio fcrontab tengo lo siguiente:

    !mailto(feztaa),mail(yes),forcemail(yes),noticenotrun(yes)
    %monthly * * 1-4 oldmail

Esto fija las mismas opciones que en el fcrontab del administrador, y
entonces ejecuta oldmail tan pronto como puede, en algún momento dentro
de los cuatro primeros días de cada mes (oldmail es otro guión simple
que escribí para, simplemente, archivar y comprimir mi correo antiguo).

Lo que he escrito aquí no es, ni de lejos, sustituto de leer la página
del manual; apenas he arañado la superficie en esta receta. Si quieres
sacar el máximo partido de fcron, hazte un favor y lee la página del
manual.

Para instalar tu fcrontab, ejecuta:

##--CÓDIGO--##
fcrontab -u <usuario> -e
##--CÓDIGO--##

La opción -u puede omitirse si el fcrontab que quieres editar pertenece
al mismo usuario que ejecuta el comando. El editor por defecto (definido
en /etc/fcron.conf) debería comenzar con un pantalla en blanco. Escribe
las entradas de acuerdo a la página del manual de fcrontab(5).

Cuando hayas terminado, salva los cambios y sal (:wq en vim). Fcrontab
comprueba entonces tu trabajo buscando errores, y se queja si encuentra
alguno. Además, rehusará utilizar el fcrontab defectuoso. Si obtienes un
error, inténtalo de nuevo y lee la página del manual para ver qué puedes
estar haciendo mal. Cuando consigas tenerlo bien, fcrontab pasa el
fichero a fcron y lo salva en /var/lib/fcron/<nombre_usuario>. ¡NO
EDITES ESTE FICHERO! Utiliza siempre fcron para editar tu fichero
fcrontab, es mucho más seguro de esta forma.

10. Ahora, para controlar quién tiene acceso a fcron, edita
/etc/fcron.allow y fcron.deny. Creo que sólo el administrador y un
selecto grupo de usuarios privilegiados deberían poder utilizar tal
demonio, luego yo escribo "all" en fcron.deny y "root" y "feztaa" en
fcron.allow.

11. Instalaremos ahora el guión cronmail del que te he hablado en la
introducción. Si no quieres este guión, ¡has terminado! Si lo quieres,
continúa leyendo...

Primero, ejecuta esto como administrador (root):

##--CÓDIGO--##
cat >/usr/bin/cronmail <<"EOF"
#!/bin/bash
# Versión: 1.4
# Autor: Rob Park <feztaa@shaw.ca>
# Licencia: GNU General Public License

########################################################################
# ¡Probablemente quieras editar las dos definiciones de variables      #
# siguientes para ajustarte mejor a tu sistema! ¡Te he avisado!        #
########################################################################

# ¿Cuál es el nombre por defecto a usar si no se especifica ninguno, o
# si se especifica el administrador (root)? Básicamente, ¿quién recibe
# el correo del administrador?
default="feztaa"

# ¿A dónde debería enviarse el correo? Esto es un buzón de formato mbox
# que está en algún lugar dentro del directorio principal del usuario
# (lo lamento, sólo se soporta el formato mbox, por ahora).
mbox="mail/cron"

##################################################################
# ¡No deberías necesitar editar nada por debajo de esta línea ;) #
##################################################################

# Ignora todos los argumentos hasta encontrar uno que sea un nombre
# válido de usuario
until id "$1" >/dev/null 2>&1
do
  shift
done

# El nombre del usuario es ahora el primer argumento
name="$1"

# Si no se encuentra el primer argumento, o es "root", enviar el mensaje
# al usuario por defecto.
[ "$name" == "" ] && name=$default
[ "$name" == "root" ] && name=$default

# Redirecciona la entrada estándar al buzón mbox en el directorio
# principal del usuario, añadiendo algunas cabeceras para hacerlo
# parecerse más a un correo real.
formail -a "Message-ID:" -I "From: Cron <fcron@localhost>" -I "To: $name <$name@localhost>" >> /home/$name/$mbox
EOF
chmod 755 /usr/bin/cronmail
##--CÓDIGO--##

Este guión es un sustituto muy simple de sendmail. Busca un nombre de
usuario en la lista de argumentos, marca el mensaje con algunas cabeceras de
corro usando formail y lo envía a un buzón mbox en el directorio
principal del usuario. Puedes editar dónde exactamente quieres recibirlo
y quién quieres que reciba el correo del administrador. Como yo recibo
todo mi correo en ~/mail, tengo configurado el guión para que envíe el
correo a ~/mail/cron.

Lo siguiente que necesitamos hacer es ordenar a fcron utilizar nuestro
guión cronmail. Ejecuta este comando para hacer el cambio:

##--CÓDIGO--##
cd /etc &&
perl -i -pe 's%^sendmail\s*=.*$%sendmail=/usr/bin/cronmail%' fcron.conf
##--CÓDIGO--##

Ahora, reinicia fcron (si estaba ejecutándose), y ¡ya estás preparado
para continuar!

El Fin
------

¡Lo has hecho! Ahora tienes una utilidad de planificación de tareas que
ejecutará comandos automáticamente por ti.

Si tienes alguna pregunta, sugerencia o problema, POR FAVOR escríbeme y
te ayudaré tanto como mi habilidad me permita.