¿Cómo escribir un cron que ejecute un script todos los días a la medianoche?

144

He oído que crontab es una buena opción, pero ¿cómo escribo la línea y dónde la pongo en el servidor?

Matt Elhotiby
fuente

Respuestas:

261

Aquí hay un buen tutorial sobre qué es crontab y cómo usarlo en Ubuntu. Su línea crontab se verá así:

00 00 * * * ruby path/to/your/script.rb

( 00 00indica medianoche - 0 minutos y 0 horas - y los *s significan todos los días de cada mes).

Sintaxis: 
  mm hh dd mt wd comando

  mm minuto 0-59
  hh hora 0-23
  dd día del mes 1-31
  mt mes 1-12
  wd día de la semana 0-7 (domingo = 0 o 7)
  comando: lo que quieres ejecutar
  todos los valores numéricos pueden reemplazarse por *, lo que significa que todos
Jordan Running
fuente
1
¿No te pierdes la columna 'ejecutar como usuario'?
Lucas Cimon
44
@LucasCimon La columna de usuario (que iría antes del comando) está permitida en /etc/crontab(en Ubuntu), pero cuando ejecuta crontab -eestá editando un crontab específico del usuario, que no permite esta columna. IIRC Ubuntu desaconseja salir /etc/crontabmanualmente porque puede sobrescribirse. Ver aquí: stackoverflow.com/questions/8475694/…
Jordan Running
@Jordan, por lo que la respuesta a crontab para root essudo crotab -u root -e
guiones el
40

desde la página del manual

linux$ man -S 5 crontab

   cron(8) examines cron entries once every minute.

   The time and date fields are:

          field          allowed values
          -----          --------------
          minute         0-59
          hour           0-23
          day of month   1-31
          month          1-12 (or names, see below)
          day of week    0-7 (0 or 7 is Sun, or use names)
   ...
   # run five minutes after midnight, every day
   5 0 * * *       $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
   ...

Es bueno tener en cuenta los "apodos" especiales que se pueden usar (documentados en la página de manual), en particular "@reboot", que no tiene una alternativa de fecha y hora.

   # Run once after reboot.
   @reboot         /usr/local/sbin/run_only_once_after_reboot.sh

También puede usar este truco para ejecutar su trabajo cron varias veces por minuto.

   # Run every minute at 0, 20, and 40 second intervals
   * * * * *       sleep 00; /usr/local/sbin/run_3times_per_minute.sh
   * * * * *       sleep 20; /usr/local/sbin/run_3times_per_minute.sh
   * * * * *       sleep 40; /usr/local/sbin/run_3times_per_minute.sh

Para agregar un trabajo cron, puede hacer una de estas tres cosas:

  1. agregue un comando al crontab de un usuario, como se muestra arriba (y de crontab, sección 5, página man).

    • editar crontab de un usuario como root con crontab -e -u <username>
    • o edite el crontab del usuario actual con solo crontab -e
    • Puede configurar el editor con la EDITORvariable de entorno
      • env EDITOR=nano crontab -e -u <username>
      • o establezca el valor de EDITOR para toda su sesión de shell
        1. export EDITOR=vim
        2. crontab -e
    • Hacer scripts ejecutables con chmod a+x <file>


  1. cree un script / programa como trabajo cron y agréguelo a los /etc/cron.*lydirectorios anacron del sistema

    • directorios anacron /etc/cron.*ly:
      • /etc/cron.daily
      • /etc/cron.hourly
      • /etc/cron.monthly
      • /etc/cron.weekly
    • como en:
      • /etc/cron.daily/script_runs_daily.sh
      • chmod a+x /etc/cron.daily/script_runs_daily.sh - hazlo ejecutable
    • Consulte también la página de manual de anacron: man anacron
    • Hacer scripts ejecutables con chmod a+x <file>
    • ¿Cuándo se ejecutan estas secuencias de comandos cron. * Ly?
      • Para RHEL / CentOS 5.x, se configuran /etc/crontabo se /etc/anacrontabejecutan a una hora establecida
      • Los sistemas RHEL / CentOS 6.x + y Fedora 17+ Linux solo definen esto en /etc/anacrontab, y definen cron.hourly en/etc/cron.d/0hourly


  1. O, uno puede crear crontables del sistema en /etc/cron.d.

    • La sintaxis crontab descrita anteriormente (además de proporcionar un usuario para ejecutar cada trabajo como) se coloca en un archivo y el archivo se coloca en el directorio /etc/cron.d.
    • Estos son fáciles de administrar en el empaque del sistema (por ejemplo, paquetes RPM), por lo que generalmente pueden ser específicos de la aplicación.
    • La diferencia de sintaxis es que se debe especificar un usuario para el trabajo cron después de los campos de hora / fecha y antes del comando a ejecutar.
    • Los archivos agregados /etc/cron.dno necesitan ser ejecutables.
    • Aquí hay un trabajo de ejemplo que se ejecuta como el usuario someuser, y el uso de /bin/bashcomo el shell es forzado.


   File: /etc/cron.d/myapp-cron
   # use /bin/bash to run commands, no matter what /etc/passwd says
   SHELL=/bin/bash
   # Execute a nightly (11:00pm) cron job to scrub application records
   00 23 * * * someuser /opt/myapp/bin/scrubrecords.php
Russell E Glaue
fuente
5

A veces necesitará especificar PATH y GEM_PATH usando crontab con rvm.

Me gusta esto:

# top of crontab file
PATH=/home/user_name/.rvm/gems/ruby-2.2.0/bin:/home/user_name/.rvm/gems/ruby-2.2.0@global/bin:/home/user_name/.rvm/rubies/ruby-2.2.$
GEM_PATH=/home/user_name/.rvm/gems/ruby-2.2.0:/home/user_name/.rvm/gems/ruby-2.2.0@global

# jobs
00 00 * * * ruby path/to/your/script.rb
00 */4 * * * ruby path/to/your/script2.rb
00 8,12,22 * * * ruby path/to/your/script3.rb
LV2014
fuente
4

Guía rápida para configurar un trabajo cron

Cree un nuevo archivo de texto, por ejemplo: mycronjobs.txt

Para cada trabajo diario (00:00, 03:45), guarde las líneas de programación en mycronjobs.txt

00 00 * * * ruby path/to/your/script.rb
45 03 * * * path/to/your/script2.sh

Envíe los trabajos a cron (cada vez que ejecuta esto, cron elimina lo que se ha almacenado y se actualiza con la nueva información en mycronjobs.txt )

crontab mycronjobs.txt

Información extra útil

Ver trabajos cron actuales

crontab -l

Eliminar todos los trabajos cron

crontab -r
dyltini
fuente
Su sintaxis crontab es incorrecta para 03:45. Los campos de crontab son Minuto y Hora, es decir, "45 03": lo tiene al revés en su publicación.
Russell E Glaue
1

Puede ejecutar el script de shell de dos maneras, ya sea utilizando el trabajo cron o escribiendo un script de shell

Supongamos que el nombre de su script es "yourscript.sh"

Primero verifique el permiso del usuario del script. use el siguiente comando para verificar el permiso del usuario del script

ll script.sh

Si la secuencia de comandos está en la raíz, utilice el siguiente comando

sudo crontab -e

En segundo lugar, si el script contiene al usuario "ubuntu", utilice el siguiente comando

crontab -e

Agregue la siguiente línea en su crontab: -

55 23 * * * /path/to/yourscript.sh

Otra forma de hacerlo es escribir un script y ejecutarlo en el fondo

Aquí está el script donde debe poner el nombre del script (por ejemplo: - youscript.sh) que se ejecutará a las 23:55 pm todos los días

#!/bin/bash while true do /home/modassir/yourscript.sh sleep 1d done

guárdelo en un archivo (nombremos "every-day.sh")

dormir 1d: significa que espera un día y luego vuelve a funcionar.

ahora dé permiso a su script. use el siguiente comando: -

chmod + x every-day.sh

ahora, ejecute este script de shell en segundo plano usando "nohup". Esto seguirá ejecutando el script incluso después de cerrar sesión en su sesión.

use el siguiente comando para ejecutar el script.

nohup ./every-day.sh &

Nota: - para ejecutar "yourscript.sh" a las 23:55 pm todos los días, debe ejecutar el script "every-day.sh" exactamente a las 23:55 pm.

Modassir Haider
fuente
0

Pon esta frase en un archivo crontab: 0 0 * * * / usr / local / bin / python /opt/ByAccount.py> /var/log/cron.log 2> & 1

MAES
fuente