Comment écrire un cron qui exécutera un script tous les jours à minuit?

144

J'ai entendu dire que crontab est un bon choix, mais comment écrire la ligne et où la placer sur le serveur?

Matt Elhotiby
la source

Réponses:

261

Voici un bon tutoriel sur ce qu'est crontab et comment l'utiliser sur Ubuntu. Votre ligne crontab ressemblera à ceci:

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

( 00 00indique minuit - 0 minute et 0 heure - et le *s signifie tous les jours de chaque mois.)

Syntaxe: 
  commande mm hh dd mt wd

  mm minute 0-59
  hh heure 0-23
  jj jour du mois 1-31
  mois mois 1-12
  wd jour de la semaine 0-7 (dimanche = 0 ou 7)
  commande: ce que vous voulez exécuter
  toutes les valeurs numériques peuvent être remplacées par * ce qui signifie tout
Jordan Running
la source
1
Ne manquez-vous pas la colonne «Run-as-user»?
Lucas Cimon
4
@LucasCimon La colonne utilisateur (qui irait avant la commande) est autorisée dans /etc/crontab(sur Ubuntu), mais lorsque vous exécutez, crontab -evous modifiez un crontab spécifique à l'utilisateur, ce qui n'autorise pas cette colonne. IIRC Ubuntu déconseille de quitter /etc/crontabmanuellement car il peut être écrasé. Voir ici: stackoverflow.com/questions/8475694/…
Jordan Running
@Jordan donc la réponse à crontab pour root estsudo crotab -u root -e
dashesy
40

depuis la page de manuel

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

Il est bon de noter les "surnoms" spéciaux qui peuvent être utilisés (documentés dans la page de manuel), en particulier "@reboot" qui n'a pas d'alternative à l'heure et à la date.

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

Vous pouvez également utiliser cette astuce pour exécuter votre tâche cron plusieurs fois par minute.

   # 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

Pour ajouter une tâche cron, vous pouvez effectuer l'une des trois opérations suivantes:

  1. ajoutez une commande à la crontab d'un utilisateur, comme indiqué ci-dessus (et à partir de la crontab, section 5, page de manuel).

    • modifier le crontab d'un utilisateur en tant que root avec crontab -e -u <username>
    • ou modifiez le crontab de l'utilisateur actuel avec juste crontab -e
    • Vous pouvez définir l'éditeur avec la EDITORvariable d'environnement
      • env EDITOR=nano crontab -e -u <username>
      • ou définissez la valeur de EDITOR pour toute votre session shell
        1. export EDITOR=vim
        2. crontab -e
    • Rendre les scripts exécutables avec chmod a+x <file>


  1. créer un script / programme en tant que tâche cron et l'ajouter aux /etc/cron.*lyrépertoires anacron du système

    • Répertoires anacron /etc/cron.*ly:
      • /etc/cron.daily
      • /etc/cron.hourly
      • /etc/cron.monthly
      • /etc/cron.weekly
    • un péché:
      • /etc/cron.daily/script_runs_daily.sh
      • chmod a+x /etc/cron.daily/script_runs_daily.sh - le rendre exécutable
    • Voir aussi la page de manuel anacron: man anacron
    • Rendre les scripts exécutables avec chmod a+x <file>
    • Quand ces scripts cron. * Ly s'exécutent-ils?
      • Pour RHEL / CentOS 5.x, ils sont configurés dans /etc/crontabou /etc/anacrontabpour s'exécuter à une heure définie
      • Les systèmes Linux RHEL / CentOS 6.x + et Fedora 17+ ne le définissent que dans /etc/anacrontabet définissent cron.hourly dans/etc/cron.d/0hourly


  1. Ou, on peut créer des crontables système dans /etc/cron.d.

    • La syntaxe crontab décrite précédemment (avec en plus un utilisateur pour exécuter chaque travail en tant que) est placée dans un fichier, et le fichier est déposé dans le répertoire /etc/cron.d.
    • Ceux-ci sont faciles à gérer dans les packages système (par exemple, les packages RPM), ils peuvent donc généralement être spécifiques à une application.
    • La différence de syntaxe est qu'un utilisateur doit être spécifié pour la tâche cron après les champs heure / date et avant l'exécution de la commande.
    • Les fichiers ajoutés /etc/cron.dn'ont pas besoin d'être exécutables.
    • Voici un exemple de travail qui est exécuté en tant qu'utilisateur someuser, et l'utilisation de /bin/bashcomme shell est forcée.


   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
la source
5

Parfois, vous devrez spécifier PATH et GEM_PATH en utilisant crontab avec rvm.

Comme ça:

# 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
la source
4

Guide rapide pour configurer une tâche cron

Créez un nouveau fichier texte, exemple: mycronjobs.txt

Pour chaque tâche quotidienne (00:00, 03:45), enregistrez les échéances dans mycronjobs.txt

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

Envoyez les travaux à cron (chaque fois que vous exécutez ceci, cron supprime ce qui a été stocké et met à jour avec les nouvelles informations dans mycronjobs.txt )

crontab mycronjobs.txt

Informations supplémentaires utiles

Voir les emplois cron actuels

crontab -l

Supprimer toutes les tâches cron

crontab -r
Dyltini
la source
Votre syntaxe crontab est incorrecte pour 03:45. Les champs crontab sont Minute puis Hour, c'est-à-dire "45 03" - vous l'avez à l'envers dans votre message.
Russell E Glaue
1

Vous pouvez exécuter un script shell de deux manières, soit en utilisant le travail cron, soit en écrivant un script shell

Supposons que le nom de votre script soit "yourscript.sh"

Vérifiez d'abord l'autorisation utilisateur du script. utilisez la commande ci-dessous pour vérifier l'autorisation utilisateur du script

ll script.sh

Si le script est en racine, utilisez la commande ci-dessous

sudo crontab -e

Deuxièmement, si le script contient l'utilisateur "ubuntu", utilisez la commande ci-dessous

crontab -e

Ajoutez la ligne suivante dans votre crontab: -

55 23 * * * /chemin/vers/votrescript.sh

Une autre façon de faire est d'écrire un script et de l'exécuter dans le backgroud

Voici le script où vous devez mettre votre nom de script (par exemple: - youscript.sh) qui va s'exécuter à 23h55 tous les jours

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

enregistrez-le dans un fichier (appelons-le "tous les jours.sh")

sleep 1d - signifie qu'il attend un jour, puis il s'exécute à nouveau.

donnez maintenant la permission à votre commande script.use ci-dessous: -

chmod + x tous les jours.sh

maintenant, exécutez ce script shell en arrière-plan en utilisant "nohup". Cela continuera à exécuter le script même après la déconnexion de votre session.

utilisez la commande ci-dessous pour exécuter le script.

nohup ./every-day.sh &

Remarque: - pour exécuter "yourscript.sh" à 23h55 tous les jours, vous devez exécuter le script "every-day.sh" à exactement 23h55.

Modassir Haider
la source
0

Mettez cette phrase dans un fichier crontab: 0 0 * * * / usr / local / bin / python /opt/ByAccount.py> /var/log/cron.log 2> & 1

MAES
la source