# rm-rf.es | Administración de sistemas

Bitácora personal de un SysAdmin Gnu/Linux, Windows, BSD...

! bad user (foo) en los cron jobs de Solaris

Suponiendo que tenemos un usuario en Solaris que debería estar ejecutando los cron jobs establecidos en su crontab pero no está siendo así, lo primero que debemos hacer es revisar los logs de cron para encontrar el origen del problema. Podemos consultarlos en /var/cron/log.

Si lo que vemos es entradas similares a la siguiente en el log…

! bad user (foo) Tue Sep 12 15:30:10 2012

… puede significar que el usuario foo no tiene privilegios para la ejecución de crontabs, habiendo sido denegado a través del fichero /etc/cron.deny (ver “Cron linux: autorizar o denegar su uso a usuarios“):

foo:~$ crontab -l foo
You (foo) are not allowed to use this program (crontab)
See crontab(1) for more information

Pero también es muy probable que el usuario se encuentre bloqueado a nivel de sistema operativo, ya sea porque su password ha expirado, bloqueo de cuenta por excesivos logins incorrectos, etc. Puede haber muchas causas. En este caso veremos que la cuenta está marcada como el prefijo \*LK\* en el password (locked) de su entrada en el fichero /etc/shadow:

foo:\*LK\*asd73jasd80kj:::::::

También podríamos averiguarlo sin mirar el fichero shadow, con el comando passwd -s:

# passwd -s foo
foo    LK

Para desbloquearla utilizamos el parámetro -u (unlock) de passwd:

# passwd -u foo
passwd: password information changed for foo
# passwd -s foo
foo       PS

Y ya podemos ejecutar crons. El prefijo LK ha desaparecido del fichero /etc/shadow:

foo:asd73jasd80kj:::::::

Cron o anacron, ¿qué elegir?

Cron LinuxPese a que aparentemente su función es la misma, es decir, la de realizar tareas de forma automática y desantendida en momentos concretos y/o periódicos, cada uno tiene sus peculiaridades y características que los hacen bastante distintos y su utilización depende de ámbitos distintos. De cron/crontab ya he hablado en varias ocasiones, no así de anacron, podéis usar el buscador o seguir el anterior enlace para encontrar más artículos.

Básicamente, las principales diferencias entre cron y anacron son las siguientes:

  1. Cron es estricto al 100% a la hora de ejecutar tareas configuradas, todo lo contrario que anacron. Si hay un cron que se tiene que ejecutar todos los días a las 03:00 y el sistema está apagado, cron no lo ejecutará. En cambio, anacron sí, lo ejecutará una vez que el sistema vuelva a encenderse si el trabajo tenía que haberse realizado cuando el equipo estaba apagado. Es decir, en servidores y sistemas con disponibilidad 24 x 7 x 365 es mejor usar cron, pero en equipos de escritorio o aquellos que puedan estar apagados es mejor anacron.
  2. Cron permite programar tareas con exactitud de minutos, mientras que en anacron el mínimo es la ejecución diaria de la tarea, pudiendo únicamente especificar un rango horario en el que se ejecutará.
  3. Cualquier usuario puede tener sus propios cron configurados, mientras que para usar anacron hay que ser superusuario. (cron es versatil y se puede restringir si fuera necesario).
  4. Cron corre como demonio todo el tiempo mientras que anacron se ejecuta a través de scripts en el arranque de sistema o con llamadas propias desde cron.

Normalmente en la mayoría de sistemas de producción, por no decir en todos encontraréis que se usa cron, anacron se suele dejar para equipos de escritorio, portátiles y demás equipos de uso personal.

Cron linux: autorizar o denegar su uso a usuarios

A través de los ficheros cron.allow y cron.deny, ubicados en /etc podemos configurar qué usuarios tienen permitido el uso de tareas programadas a través de cron en linux. La sintaxis es sencilla, cada fichero tiene una lista con los usuarios (uno por línea) a los que se les permite o deniega el uso de crontab.

Hay que tener en cuenta que la existencia o no existencia de los ficheros afectan directamente a las restricciones. Normalmente, la existencia del fichero cron.deny no es importante, únicamente lo será cuando contenga listado de usuarios dentro. En cambio, el fichero cron.allow por defecto no existe, y en el momento que existe la restricción es total para todos los usuarios excepto los listados en él, si existe pero está vacío, nadie podrá utilizar los cron.

Lo más lógico entendiendo esto es no crear el fichero /etc/cron.allow a no ser que se quiera permitir el uso de cron a unos usuarios específicos. Si lo que se quiere hacer es denegar a ciertos usuarios se añadirán en el /etc/cron.deny sin crear el fichero cron.allow.

Si quisieramos denegar el uso de cron a los usuarios foo y bar añadiríamos lo siguiente al fichero /etc/cron.deny

foo
bar

A partir de ese momento, si quisieramos usar los cron recibiríamos el siguiente mensaje:

# su foo
$ crontab -l
You (foo) are not allowed to use this program (crontab)
See crontab(1) for more information

crontab: modo de uso y ejemplos

El comando crontab nos permite añadir, eliminar o modificar los cron configurados para un usuario de una máquina Unix.

El modo de uso es el siguiente: crontab -<opciones>, a continuación os muestro unos ejemplos:

Editar los cron del usuario “alex”:

crontab -e -u alex

Listar los cron del usuario “alex”:

crontab -l -u alex

Eliminar los cron del usuario alex:

crontab -r -u alex

En todos estos casos, si omitimos “-u alex” accederemos a los cron del usuario con el que estemos identificados en el sistema. Una vez dentro de la gestión de crontab (si estamos editando con -e” visualizaremos todos los cron configurados para el usuario, ejemplo:

Nota: Automáticamente accederéis a la gestión de los cron con el editor que haya configurado por defecto, si queréis modificarlo revisad esta entrada: Cambiar editor crontab por defecto)

$ crontab -e -u alex
0 * * * * /usr/sbin/ntpdate hora.oxixares.com > /dev/null
0 20 * * * echo "Me ejecuto a las ocho en punto" > /dev/null

Crontab pone a nuestra disposición 6 campos cuyo significado es el siguiente (en orden, de izquierda a derecha) :

  1. Minuto (0-59)
  2. Hora (0-23)
  3. Día del mes (1-31)
  4. Mes del año (1-12)
  5. Día de la semana (0-7, 0 y 7 es Domingo)
  6. Comando/Script/tarea a ejecutar

En los 5 primeros campos podemos usar Wildcard (*), para especificar que se ejecutará en cualquiera de las opciones de ese campo (si son horas todas las horas, si son días todos los días, etc).

En el primer ejemplo que he mostrado antes, cada hora en punto ejecutamos la sincronización horaria y mandamos la salida a /dev/null/:

0 * * * * /usr/sbin/ntpdate hora.oxixares.com > /dev/null

En el segundo ejemplo, simplemente escribimos la frase a las 20:00 todos los días:

0 20 * * * echo "Me ejecuto a las ocho en punto" > /dev/null

Al comienzo del fichero podemos especificar una dirección de correo electrónico a la cual se envíen los informes de ejecución de crontabs:

MAILTO="test@test.com"

Con estas nociones básicas ya podéis trabajar de un modo eficaz gestionando cron mediante el comando crontab.

Cambiar editor crontab por defecto

Puede que al tratar de editar los crontabs de un usuario en tu máquina tengas un editor que no sea de tu agrado (pico, nano, vi, vim…):

crontab -e

Es muy sencillo configurar por defecto el editor que desees, simplemente exporta la variable EDITOR con el que desees:

export VISUAL='pico -w'

o:

export VISUAL='vim'

Puedes añadir esta línea en el .bashrc de tu usuario para que sea permanente.

Generar crontab de forma sencilla

En este sitio web encontraréis un asistente que os ayudará a generar crontabs, que posteriormente solo tendréis que copiar & pegar, es útil cuando tratamos de generar crons con cierta complejidad. Espero que os sea de utilidad.

Ver el perfil de Alejandro García García en LinkedIn