¿Cómo crear un trabajo cron usando Bash automáticamente sin el editor interactivo?

Resuelto Raúl Roa asked hace 15 años • 22 respuestas

¿Tiene crontabalgún argumento para crear trabajos cron sin usar el editor ( crontab -e)? Si es así, ¿cuál sería el código para crear un trabajo cron a partir de un script Bash?

Raúl Roa avatar May 18 '09 23:05 Raúl Roa
Aceptado

Puede agregar al crontab de la siguiente manera:

#write out current crontab
crontab -l > mycron
#echo new cron into cron file
echo "00 09 * * 1-5 echo hello" >> mycron
#install new cron file
crontab mycron
rm mycron

Explicación de la línea cron

* * * * * "command to be executed"
- - - - -
| | | | |
| | | | ----- Day of week (0 - 7) (Sunday=0 or 7)
| | | ------- Month (1 - 12)
| | --------- Day of month (1 - 31)
| ----------- Hour (0 - 23)
------------- Minute (0 - 59)

Fuente nixCraft .

dogbane avatar May 18 '2009 16:05 dogbane

Es posible que puedas hacerlo sobre la marcha.

crontab -l | { cat; echo "0 0 0 0 0 some entry"; } | crontab -

Esto funciona porque crontab -lenumera los trabajos crontab actuales, catlos imprime (desde la entrada estándar), echoimprime el nuevo comando y crontab -agrega todo el material impreso en el archivo crontab. Puedes ver el efecto haciendo un nuevo archivo crontab -l.

Nota: si el usuario no tiene un crontab existente, es posible que vea este mensaje:

no crontab for <username>

De todos modos, todavía funciona, incluso si ves ese mensaje.

TheBonsai avatar May 18 '2009 18:05 TheBonsai

Este más corto no requiere un archivo temporal, es inmune a múltiples inserciones y le permite cambiar la programación de una entrada existente.

Digamos que tienes estos:

croncmd="/home/me/myfunction myargs > /home/me/myfunction.log 2>&1"
cronjob="0 */15 * * * $croncmd"

Para agregarlo al crontab, sin duplicación:

( crontab -l | grep -v -F "$croncmd" ; echo "$cronjob" ) | crontab -

Para eliminarlo del crontab cualquiera que sea su programación actual:

( crontab -l | grep -v -F "$croncmd" ) | crontab -

Notas:

  • grep -F coincide con la cadena literalmente, ya que no queremos interpretarla como una expresión regular
  • También ignoramos la programación horaria y solo buscamos el comando. Por aquí; el horario se puede cambiar sin el riesgo de agregar una nueva línea al crontab
MoonCactus avatar Jul 31 '2013 16:07 MoonCactus

Gracias a todos por su ayuda. Juntando lo que encontré aquí y en otros lugares, se me ocurrió esto:

El código

command="php $INSTALL/indefero/scripts/gitcron.php"
job="0 0 * * 0 $command"
cat <(fgrep -i -v "$command" <(crontab -l)) <(echo "$job") | crontab -

No pude encontrar la manera de eliminar la necesidad de las dos variables sin repetirme.

commandEs obviamente el comando que quiero programar. jobtoma $commandy agrega los datos de programación. Necesitaba ambas variables por separado en la línea de código que hace el trabajo.

Detalles

  1. Crédito a duckyflip, uso esta pequeña cosa de redireccionamiento ( <(*command*)) para convertir la salida crontab -len entrada para el fgrepcomando.
  2. fgrepluego filtra cualquier coincidencia de $command( -vopción), sin distinguir entre mayúsculas y minúsculas ( -iopción).
  3. Nuevamente, la pequeña redirección ( <(*command*)) se usa para convertir el resultado nuevamente en entrada para el catcomando.
  4. El catcomando también se recibe echo "$job"(se explica por sí mismo), nuevamente, mediante el uso de la redirección ( <(*command*)).
  5. Entonces, la salida filtrada crontab -ly la simple echo "$job", combinada, se canalizan ('|') para crontab -finalmente escribirse.
  6. ¡Y todos vivieron felices por siempre!

En una palabra:

Esta línea de código filtra cualquier trabajo cron que coincida con el comando, luego escribe los trabajos cron restantes con el nuevo, actuando efectivamente como una función de "agregar" o "actualizar". Para usar esto, todo lo que tienes que hacer es intercambiar los valores de las variables commandy job.

Stoutie avatar Nov 12 '2011 18:11 Stoutie

EDITAR (sobrescritura fija):

cat <(crontab -l) <(echo "1 2 3 4 5 scripty.sh") | crontab -
duckyflip avatar May 18 '2009 16:05 duckyflip