¿Cómo crear un trabajo cron usando Bash automáticamente sin el editor interactivo?
¿Tiene crontab
algú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?
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 .
Es posible que puedas hacerlo sobre la marcha.
crontab -l | { cat; echo "0 0 0 0 0 some entry"; } | crontab -
Esto funciona porque crontab -l
enumera los trabajos crontab actuales, cat
los imprime (desde la entrada estándar), echo
imprime 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.
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
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.
command
Es obviamente el comando que quiero programar. job
toma $command
y agrega los datos de programación. Necesitaba ambas variables por separado en la línea de código que hace el trabajo.
Detalles
- Crédito a duckyflip, uso esta pequeña cosa de redireccionamiento (
<(*command*)
) para convertir la salidacrontab -l
en entrada para elfgrep
comando. fgrep
luego filtra cualquier coincidencia de$command
(-v
opción), sin distinguir entre mayúsculas y minúsculas (-i
opción).- Nuevamente, la pequeña redirección (
<(*command*)
) se usa para convertir el resultado nuevamente en entrada para elcat
comando. - El
cat
comando también se recibeecho "$job"
(se explica por sí mismo), nuevamente, mediante el uso de la redirección (<(*command*)
). - Entonces, la salida filtrada
crontab -l
y la simpleecho "$job"
, combinada, se canalizan ('|') paracrontab -
finalmente escribirse. - ¡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 command
y job
.
EDITAR (sobrescritura fija):
cat <(crontab -l) <(echo "1 2 3 4 5 scripty.sh") | crontab -