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

¿Tiene crontab un argumento para crear trabajos cron sin usar el editor (crontab -e)? Si es así, ¿cuál sería el código para crear un cronjob desde un script de 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 pueda hacerlo sobre la marcha

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

crontab -l lista los trabajos actuales de crontab, cat imprime, echo imprime el nuevo comando y crontab - agrega todo el material impreso en el archivo crontab. Puede ver el efecto haciendo un nuevo crontab -l .

Este más corto no requiere ningún archivo temporal, es inmune a múltiples inserciones y le permite cambiar el cronogtwig 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 horario actual:

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

Notas:

  • grep -F coincide literalmente con la cadena, ya que no queremos interpretarlo como una expresión regular
  • También ignoramos el horario y solo buscamos el comando. De esta manera; el cronogtwig puede cambiarse sin el riesgo de agregar una nueva línea al crontab

Gracias a todos por su ayuda. Remontándome a lo que encontré aquí y en otro lugar, 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 progtwigr. job toma $command y agrega los datos de progtwigción. Necesitaba ambas variables por separado en la línea de código que hace el trabajo.

Detalles

  1. Gracias a duckyflip, utilizo este pequeño elemento de redirección ( < (*command*) ) para convertir la salida de crontab -l en entrada para el comando fgrep .
  2. fgrep luego filtra cualquier coincidencia de $command (opción -v ), insensible a mayúsculas y minúsculas (opción -i ).
  3. Una vez más, la pequeña cosa de redirección ( < (*command*) ) se usa para convertir el resultado de nuevo en entrada para el comando cat .
  4. El comando cat también recibe el echo "$job" (que se explica por sí mismo), de nuevo, mediante el uso de la función de redireccionamiento ( < (*command*) ).
  5. Por lo tanto, la salida filtrada de crontab -l y del echo "$job" simple echo "$job" , combinados, se transmiten ('|') a crontab - para finalmente escribirse.
  6. ¡Y todos vivieron felices por siempre!

En una palabra:

Esta línea de código filtra cualquier tarea cron que coincida con el comando, luego escribe las tareas cron restantes con la nueva, actuando efectivamente como una función "agregar" o "actualizar". Para usar esto, todo lo que tiene que hacer es intercambiar los valores para el command y job variables de job .

EDITAR (sobrescritura fija):

 cat < (crontab -l) <(echo "1 2 3 4 5 scripty.sh") | crontab - 

Ha habido muchas respuestas buenas sobre el uso de crontab, pero no se menciona un método más simple, como usar cron .

El uso de cron aprovecharía los archivos y directorios del sistema ubicados en /etc/crontab , /etc/cron.daily,weekly,hourly o /etc/cron.d/ :

 cat > /etc/cron.d/ < < EOF SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ 01 * * * *   EOF 

En este ejemplo anterior, creamos un archivo en /etc/cron.d/ , proporcionamos las variables de entorno para que el comando se ejecutara con éxito y proporcionamos al user el comando y el command sí. Este archivo no debe ser ejecutable y el nombre solo debe contener alfanuméricos y guiones (más detalles a continuación).

Sin embargo, para dar una respuesta completa, veamos las diferencias entre crontab vs cron/crond :

 crontab -- maintain tables for driving cron for individual users 

Para aquellos que desean ejecutar el trabajo en el contexto de su usuario en el sistema, usar crontab puede tener mucho sentido.

 cron -- daemon to execute scheduled commands 

Para aquellos que usan administración de configuración o quieren administrar trabajos para otros usuarios, en cuyo caso debemos usar cron .

Un extracto rápido de las páginas de manual le ofrece algunos ejemplos de qué hacer y qué no hacer:

/ etc / crontab y los archivos en /etc/cron.d deben ser propiedad de root, y no deben ser de escritura de grupo ni de otro tipo. En contraste con el área del spool, los archivos en /etc/cron.d o los archivos en /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly y /etc/cron.monthly también pueden ser enlaces simbólicos, siempre que tanto el enlace simbólico como el archivo al que apunta sean propiedad de root. Los archivos en /etc/cron.d no necesitan ser ejecutables, mientras que los archivos en /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly y /etc/cron.monthly, como son ejecutados por partes de ejecución (ver partes de ejecución (8) para más información).

Fuente: http://manpages.ubuntu.com/manpages/trusty/man8/cron.8.html

Administrar crons de esta manera es más fácil y más escalable desde la perspectiva del sistema, pero no siempre será la mejor solución.

Lo más probable es que esté automatizando esto, y no quiere que se agregue un solo trabajo dos veces. En ese caso, use:

 CRON="1 2 3 4 5 /root/bin/backup.sh" cat < (crontab -l) |grep -v "${CRON}" < (echo "${CRON}") 

Esto solo funciona si estás usando BASH. No estoy al tanto de la syntax DASH ( sh ) correcta.

Una variante que solo edita crontab si la cadena deseada no se encuentra allí:

 CMD="/sbin/modprobe fcpci" JOB="@reboot $CMD" TMPC="mycron" grep "$CMD" -q < (crontab -l) || (crontab -l>"$TMPC"; echo "$JOB">>"$TMPC"; crontab "$TMPC") 

Para una creación / sustitución rápida y sucia de un crontab con un script de BASH, utilicé esta notación:

 crontab <  

Si está utilizando Vixie Cron, por ejemplo, en la mayoría de las distribuciones de Linux, puede simplemente poner un archivo en /etc/cron.d con el cronjob individual.

Esto solo funciona para la raíz, por supuesto. Si su sistema lo admite, debería ver varios ejemplos allí. (Tenga en cuenta el nombre de usuario incluido en la línea, con la misma syntax que el antiguo / etc / crontab)

Es una triste falacia en cron que no hay forma de manejar esto como un usuario normal, y que muchas implementaciones de cron no tienen manera de manejar esto.

Aquí hay una función bash para agregar un comando a crontab sin duplicación

 function addtocrontab () { local frequency=$1 local command=$2 local job="$frequency $command" cat < (fgrep -i -v "$command" <(crontab -l)) <(echo "$job") | crontab - } addtocrontab "0 0 1 * *" "echo hello" 
 CRON="1 2 3 4 5 /root/bin/backup.sh" cat < (crontab -l) |grep -v "${CRON}" < (echo "${CRON}") 

agregue el parámetro -w al comando grep exact, sin el parámetro -w que agrega el cronjob "prueba" causa la eliminación del trabajo cron "testing123"

función de script para agregar / eliminar cronjobs. sin entradas de duplicación:

 cronjob_editor () { # usage: cronjob_editor '' ''  if [[ -z "$1" ]] ;then printf " no interval specified\n" ;fi if [[ -z "$2" ]] ;then printf " no command specified\n" ;fi if [[ -z "$3" ]] ;then printf " no action specified\n" ;fi if [[ "$3" == add ]] ;then # add cronjob, no duplication: ( crontab -l | grep -v -F -w "$2" ; echo "$1 $2" ) | crontab - elif [[ "$3" == remove ]] ;then # remove cronjob: ( crontab -l | grep -v -F -w "$2" ) | crontab - fi } cronjob_editor "$1" "$2" "$3" 

probado:

 $ ./cronjob_editor.sh '*/10 * * * *' 'echo "this is a test" > export_file' add $ crontab -l $ */10 * * * * echo "this is a test" > export_file 

No, no hay ninguna opción en crontab para modificar los archivos cron.

Tienes que: tomar el archivo cron actual (crontab -l> newfile), cambiarlo y poner el nuevo archivo en su lugar (crontab newfile).

Si está familiarizado con Perl, puede usar este módulo Config :: Crontab .

LLP, Andrea

función de script para agregar cronjobs. verificar entradas duplicadas, expresiones utilizables *> ”

 cronjob_creator () { # usage: cronjob_creator '' '' if [[ -z $1 ]] ;then printf " no interval specified\n" elif [[ -z $2 ]] ;then printf " no command specified\n" else CRONIN="/tmp/cti_tmp" crontab -l | grep -vw "$1 $2" > "$CRONIN" echo "$1 $2" >> $CRONIN crontab "$CRONIN" rm $CRONIN fi } 

probado:

 $ ./cronjob_creator.sh '*/10 * * * *' 'echo "this is a test" > export_file' $ crontab -l $ */10 * * * * echo "this is a test" > export_file 

fuente: mi cerebro;)

Probablemente pueda cambiar el editor predeterminado a ed y usar un heredoc para editar.

 EDITOR=ed export EDITOR crontab -e < < EOF > a > * * * * * Myscript > * * * * * AnotherScript > * * * * * MoreScript > . > w > q > EOF 

Tenga en cuenta que la tecla > en ese código significa que se presiona la tecla regresar / ingresar para crear una nueva línea.

El a significa APRENDER para que no sobrescriba nada.

El . significa que ha terminado de editar.

El w significa ESCRIBIR los cambios.

El q significa SALIR o salir ed.

puedes verlo

 crontab -l 

Puede eliminar una entrada también.

 EDITOR=ed export EDITOR crontab -e < < EOF > /Myscript/ > d > . > w > q > EOF 

Eso eliminará la entrada de crontab con Myscript en ella.

La d significa eliminar el patrón dentro de / / .

No lo vuelvas a comprobar

 crontab -l 

Esta solución funciona dentro de un script demasiado menos que > por supuesto 🙂