¿Por qué no se ejecuta mi trabajo cron.d por minuto?

33

He lanzado un montón de dardos tratando de ejecutar un script mío de Python para ejecutar cada minuto. Así que pensé en simplificarlo para hacer "la cosa más simple que podría funcionar" una vez por minuto (estoy ejecutando debian / testing).

Creé un archivo de una sola línea en /etc/cron.d/perminute:

* * * * * /bin/touch /home/me/ding_dong

Es propiedad de root y ejecutable (no estoy seguro si alguno de esos es importante). Y luego hice:

sudo service cron reload

Y luego siéntate y comienza a correr ls -ltruna y otra vez en mi directorio de inicio ( /home/me). Pero mi archivo ding_dong nunca aparece. Sé que si hago un sudo /bin/touch /home/me/ding_dong, aparece de inmediato.

Obviamente falta algo estúpido aquí.

Travis Griggs
fuente
3
Recargar el servicio cron daemon para aplicar un cambio en cron.d generalmente no es necesario porque de todos modos vuelve a escanear el directorio en busca de archivos nuevos y actualizados cada minuto.
Josip Rodin

Respuestas:

45

Al agregar una configuración cron en /etc/cron.d/o en /etc/crontab, debe agregar el nombre de usuario en qué contexto debe ejecutarse el comando, en su ejemplo

* * * * * root /bin/touch /home/me/ding_dong

Y solo una sugerencia mía: no tiene que comenzar a ejecutarse ls -ltruna y otra vez, solo use watch -n 5 "ls -ltr"y ejecutará el comando cada 5 segundos (o cualquier otro valor reemplazando 5 con lo que desea).

noggerl
fuente
9
Esto me llevó en la dirección correcta. Fue un momento de cabezazo. Lo arreglé, y aún así no funcionó. Después de leer man cronun poco más despacio y prestar especial atención a las DEBIAN specificsecciones, noté que los archivos NO deben ser grupales ni de otro tipo. Lo que había permitido en mi frustración en un momento.
Travis Griggs
¿No podrías simplemente cambiar el propietario del script a root?
Geremia
Esta línea específica me ayudó. De man cron: Además, en Debian, cron lee los archivos en el directorio /etc/cron.d. cron trata los archivos en /etc/cron.d de la misma manera que el archivo / etc / crontab (siguen el formato especial de ese archivo, es decir , incluyen el campo de usuario ). Sin embargo, son independientes de / etc / crontab: no heredan, por ejemplo, configuraciones de variables de entorno. Este cambio es específico para Debian; consulte la nota debajo de DEBIAN SPECIFIC a continuación.
Harperville
man 8 cron (en Debian) también dice que los archivos en /etc/cron.d/ solo pueden contener caracteres alfanuméricos, '-' y '_'. Específicamente, sin puntos.
mpartel
3

Para crear un nuevo crontrabajo, debe ejecutar crontab -ecomo el usuario que desea ejecutar el trabajo. Luego agregue la línea relevante en la ventana del editor que aparece:

* * * * * /bin/touch /home/me/ding_dong

La forma en que lo haces requiere un formato diferente y, de todos modos, no es una buena idea. Las tablas de referencias /etc/cron.dtienen un formato ligeramente diferente, requieren un nombre de usuario para ejecutarse. Por ejemplo:

* * * * * USERNAME /bin/touch /home/me/ding_dong

Un buen truco (como lo sugiere @VogonPoetLaureate) es capturar el error estándar de sus trabajos cron que pueden ayudar a depurarlos. Por ejemplo:

* * * * * /bin/touch /home/me/ding_dong 2>/tmp/error
terdon
fuente
66
No hay absolutamente ninguna razón para decir que cron.d "no es una buena idea". El demonio cron enviará por correo la salida cron.d stderr al nombre de usuario, y si desea redirigirlo a otra dirección de correo electrónico, la variable MAILTO está disponible.
Josip Rodin
@JosipRodin no es una buena idea para cosas que no se ejecutan desde la raíz y que usted configura. Tiene sentido para un administrador de sistemas en un sistema multiusuario, pero en su propia máquina, es más simple tener todo en su propio crontab, por lo que solo hay un lugar para verificar y crontab -lenumerar todos sus trabajos cron.
terdon
Eso supone que en realidad es solo un trabajo cron personal, que el OP realmente no aclaró: en general, hay numerosas aplicaciones para trabajos cron de usuarios no privilegiados configurados a través de cron.d, como mantenerlos todos en un solo lugar a pesar del hecho de que tiene los usuarios del servicio secuestrados, el despliegue automatizado es más fácil, etc.
Josip Rodin
@JosipRodin absolutamente. Asumí un sistema personal porque i) los sistemas empresariales están fuera de tema aquí y ii) la pregunta sugería un usuario no experto.
terdon
OK, supongo que ya no leo eso debido a la confusión común entre los sitios de superusuario y servidor predeterminado y Unix SE :)
Josip Rodin
2

Un posible error aquí es cómo se crea un archivo de una sola línea . De la documentación de Ubuntu :

... la línea tiene cinco campos de fecha y hora, seguidos de un comando, seguido de un carácter de nueva línea .

Por ejemplo, esta forma de creación no funciona:

printf "* * * * * /bin/touch /home/me/ding_dong" > /etc/cron.d/ding_dong
okoloBasii
fuente