Quiero poder agregar programáticamente un nuevo trabajo cron, ¿cuál es la mejor manera de hacerlo?
Según mi investigación , parece que podría volcar el crontab actual y luego agregar uno nuevo, volviéndolo a crontab:
(crontab -l ; echo "0 * * * * wget -O - -q http://www.example.com/cron.php") | crontab -
¿Hay una mejor manera?
Respuestas:
Siempre me ha funcionado bien.
Debería considerar un script un poco más sofisticado que puede hacer tres cosas.
Añadir una línea crontab; asegurando que no existía. Agregar cuando ya existe es malo.
Elimina la línea crontab. Tal vez solo advertencia si no existiera.
Una combinación de las dos características anteriores para reemplazar la línea crontab.
fuente
La mejor manera si está ejecutando como root, es soltar un archivo en /etc/cron.d
si usa un administrador de paquetes para empaquetar su software, simplemente puede colocar archivos en ese directorio y se interpretan como si fueran crontabs, pero con un campo adicional para el nombre de usuario, por ejemplo:
Nombre del archivo:
/etc/cron.d/per_minute
Contenido:
* * * * * root /bin/sh /home/root/script.sh
fuente
/etc/cron.d/*
? ¡Es difícil saber si algo funciona si uno tiene que esperar una hora para verificar!La solución de OP tiene un error, puede permitir que las entradas se agreguen dos veces, use a continuación para solucionarlo.
fuente
sort
antesuniq
, por ejemplo:(crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | crontab -
uniq
. Use la-u
opción ensort
.Para agregar algo a cron
Para eliminar esto de cron
la esperanza ayudaría a alguien
fuente
2>&1 | grep -v "no crontab"
porque cuando no hay crontab, la línea de salidacrontab: no crontab for...
se envía a stderr. No hay razón para capturar esa salida, enviarla a stdout y luego filtrarla usando grep. Si su objetivo es evitar vercrontab: no crontab for...
en su salida, entonces use2> /dev/null | sort....
.Si está planeando hacerlo en un escenario de ejecución única para simplemente jugar algo, eche un vistazo a 'at'
fuente
Simplemente cambie el editor al comando tee:
fuente
Suponiendo que ya hay una entrada en su crontab, el siguiente comando debería funcionar relativamente bien. Tenga en cuenta que la
$CMD
variable solo está ahí para facilitar la lectura. Ordenar antes de filtrar duplicados es importante, porqueuniq
solo funciona en líneas adyacentes.Si actualmente tiene un crontab vacío, recibirá el siguiente error para stderr:
Si desea evitar esto, puede agregar un poco de complejidad y hacer algo como esto:
fuente
La mayoría de las soluciones aquí son para agregar líneas al crontab. Si necesita más control, querrá poder controlar todo el contenido del crontab.
Puede usar tuberías para hacer esto de manera elegante.
Para reescribir completamente el crontab, haga
Esto debería ser fácil de combinar con otras respuestas descritas aquí como
O, si tiene el contenido en un archivo, es aún más simple
fuente
Aquí hay otra forma de una línea, que evita duplicados
Y aquí hay una manera de responder a JohnZ y evitar
no crontab for user
mensajes, o si necesita operar en unset -eu
entorno de tipo y no puede hacer que nada devuelva una falla (en cuyo caso la2>/dev/null
parte es opcional):O si desea dividir las cosas para que sean más legibles:
O, opcionalmente, elimine cualquier referencia a your_command (por ejemplo: si la programación ha cambiado, solo desea que se cronometre una vez). En este caso ya no necesitamos
uniq
(bonificación adicional, el orden de inserción también se conserva):fuente
man crontab también es útil:
CRONTAB (1)
NOMBRE
SINOPSIS
fuente
Agregando a la respuesta de JohnZ, aquí está la sintaxis para programar como root si eres un sudoer:
fuente
fuente
Esto verificará para asegurarse de que su comando no exista antes de agregarlo.
Salud.
fuente
La conexión de stdout en
crontab
no instaló el nuevo crontab para mí en macOS, por lo que encontré esta solución en su lugar, usando eltee
editor en un sub shell:fuente
Si desea que la tarea se ejecute como usuario:
Si desea que la tarea se ejecute con privilegios:
y verifique la tarea (con o sin 'sudo'):
fuente
También puede agregar sus tareas a /etc/cron.*/
fuente
También puede editar el archivo de texto de la tabla cron directamente, pero su solución parece perfectamente aceptable.
fuente