rango minutos manualmente job instalar horas eliminar ejemplos ejecutar crear cada bash shell cron

bash - minutos - eliminar crontab linux



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

¿Crontab tiene 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?


Aquí hay una función de 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"


EDITAR (sobrescritura fija):

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


Entonces, en Debian, Ubuntu y muchas distribuciones similares basadas en Debian ...

Existe un mecanismo de concatenación de tareas cron que toma un archivo de configuración, los agrupa y los agrega a su servicio cron en ejecución.

Puede colocar un archivo en el archivo /etc/cron.d/somefilename donde algun nombre de archivo es lo que quiera.

sudo echo "0,15,30,45 * * * * ntpdate -u time.nist.gov" >> /etc/cron.d/vmclocksync

Vamos a desmontar esto:

sudo - porque necesita privilegios elevados para cambiar configuraciones cron en el directorio / etc

echo - un vehículo para crear salida en la salida estándar. printf, cat ... también funcionaría

"- use una doble cita al principio de su cadena, usted es un profesional

0,15,30,45 * * * *: el programa de ejecución cron estándar, este se ejecuta cada 15 minutos

ntpdate -u time.nist.gov: el comando real que quiero ejecutar

"- porque mis primeras comillas dobles necesitan un amigo para cerrar la línea que se está imprimiendo

>> - el doble redireccionamiento anexa en lugar de sobrescribir *

/etc/cron.d/vmclocksync - vmclocksync es el nombre de archivo que elegí, va en /etc/cron.d/

* Si usamos la redirección, podríamos garantizar que solo tuvimos una entrada de tarea. Pero, estaríamos en riesgo de eliminar cualquier otra regla en un archivo existente. Puede decidir por sí mismo si la posible destrucción con> es correcto o los posibles duplicados con >> son para usted. Alternativamente, podría hacer algo complicado o involucrado para verificar si el nombre del archivo existe, si hay algo en él, y si está agregando algún tipo de duplicado, pero tengo cosas que hacer y no puedo hacer eso por tu ahora mismo.


Este más corto no requiere ningún archivo temporal, es inmune a múltiples inserciones y le permite cambiar el horario 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 sea cual sea su horario 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. De esta manera; El horario se puede cambiar sin el riesgo de agregar una nueva línea al crontab

Función de script para añadir cronjobs. revisar entradas duplicadas, expresiones utilizables *> "

cronjob_creator () { # usage: cronjob_creator ''<interval>'' ''<command>'' 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;)


Gracias a todos por su ayuda. Reuniendo 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 averiguar cómo 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

  1. Gracias a duckyflip, utilizo este pequeño redirigir thingy ( <(*command*) ) para convertir la salida de crontab -l en entrada para el comando fgrep .
  2. fgrep filtra las coincidencias de $command (opción -v ), sin distinción de mayúsculas (opción -i ).
  3. De nuevo, el pequeño dispositivo de redireccionamiento ( <(*command*) ) se usa para convertir el resultado nuevamente en entrada para el comando cat .
  4. El comando cat también recibe echo "$job" (explica por sí mismo), de nuevo, mediante el uso de la cosa de redirección ( <(*command*) ).
  5. Así que la salida filtrada de crontab -l y el echo "$job" simple echo "$job" , combinados, se canalizan (''|'') a crontab - para finalmente escribirlos.
  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 las variables de command y job .


Ha habido muchas respuestas buenas sobre el uso de crontab, pero no se menciona un método más simple, como el uso de 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/<job> << EOF SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ 01 * * * * <user> <command> 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 para el comando y el command sí. Este archivo no debe ser ejecutable y el nombre solo debe contener caracteres alfanuméricos y guiones (más detalles a continuación).

Para dar una respuesta completa, sin embargo, echemos un vistazo a 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 perfecto sentido.

cron -- daemon to execute scheduled commands

Para aquellos que usan la administración de la configuración o desean administrar trabajos para otros usuarios, en cuyo caso deberíamos usar cron .

Un extracto rápido de las páginas de manual le da algunos ejemplos de lo que debe y lo que no debe hacer:

/ etc / crontab y los archivos en /etc/cron.d deben ser propiedad de root, y no deben ser de grupo ni de otro tipo de escritura. A diferencia del área de 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 do, as se ejecutan por partes de ejecución (consulte partes de ejecución (8) para obtener más información).

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

Gestionar 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 quiera 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 soy consciente de la sintaxis DASH ( sh ) correcta.

Actualización: esto no funciona si el usuario aún no tiene un crontab. Una forma más confiable sería:

(crontab -l ; echo "1 2 3 4 5 /root/bin/backup.sh") | sort - | uniq - | crontab -

Alternativamente, si su distribución lo admite, también podría usar un archivo separado:

echo "1 2 3 4 5 /root/bin/backup.sh" |sudo tee /etc/crond.d/backup

Los encontré en otra pregunta SO .


Mi solución preferida a esto sería esta:

(crontab -l | grep . ; echo -e "0 4 * * * myscript/n") | crontab -

Esto asegurará que esté manejando la nueva línea en blanco en la parte inferior correctamente. Para evitar problemas con crontab, generalmente debe finalizar el archivo con una nueva línea en blanco. Y la secuencia de comandos anterior se asegura de que primero elimine las líneas en blanco con el "grep". parte, y luego agregue una nueva línea en blanco al final con "/ n" al final de la secuencia de comandos. Esto también evitará que aparezca una línea en blanco sobre su nuevo comando si su archivo crontab existente termina con una línea en blanco.


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

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

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

LLP, Andrea


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

crontab <<EOF 00 09 * * 1-5 echo hello EOF


Probablemente puede 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 el inicio > en ese código significa que la tecla de retorno / ingreso se presiona para crear una nueva línea.

El A APENDE los medios para que no sobrescriba nada.

El . significa que has terminado de editar.

La w significa ESCRIBIR los cambios.

La q significa SALIR o salir ed.

puedes comprobarlo

crontab -l

También puede eliminar una entrada.

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

Eso eliminará la entrada crontab con Myscript en ella.

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

No volver a comprobarlo

crontab -l

Esta solución funciona dentro de un script menos el > por supuesto :-)


Puedes 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 .


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

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

Es una mala característica en cron que no haya manera de manejar esto como un usuario regular, y que tantas implementaciones de cron no tienen forma de manejar esto.


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")


Usted puede ser capaz de hacerlo sobre la marcha

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

crontab -l muestra los trabajos de crontab actuales, cat imprime, echo imprime el nuevo comando y crontab - agrega todas las cosas impresas al archivo crontab. Puedes ver el efecto haciendo un nuevo crontab -l .


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 exacto, sin el parámetro -w agregando la tarea "de prueba" del cronjob eliminando la tarea de cron "testing123"

Función de script para añadir / eliminar cronjobs. no hay entradas duplicadas:

cronjob_editor () { # usage: cronjob_editor ''<interval>'' ''<command>'' <add|remove> 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