163 votes

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

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

279voto

Jordan Points 26741

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

00 00 * * * ruby chemin/vers/votre/script.rb

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

Syntaxe : 
  mm hh jj mt jj  commande

  mm minute 0-59
  hh heure 0-23
  jj jour du mois 1-31
  mt mois 1-12
  jj 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 tous

2 votes

Ne vous manque-t-il pas la colonne 'run-as-user' ?

6 votes

@LucasCimon La colonne utilisateur (qui doit être placée avant la commande) est autorisée dans /etc/crontab (sur Ubuntu), mais lorsque vous exécutez crontab -e vous éditez un crontab spécifique à l'utilisateur, qui ne permet pas cette colonne. Il me semble qu'Ubuntu décourage de modifier /etc/crontab manuellement car cela pourrait être écrasé. Voir ici : stackoverflow.com/questions/8475694/…

0 votes

@Jordan donc la réponse à crontab pour root est sudo crotab -u root -e

41voto

Russell E Glaue Points 161

À partir de la page de manuel

linux$ man -S 5 crontab

   cron(8) examine les entrées de cron une fois par minute.

   Les champs d'heure et de date sont:

          champ          valeurs autorisées
          -----          --------------
          minute         0-59
          heure          0-23
          jour du mois   1-31
          mois           1-12 (ou les noms, voir ci-dessous)
          jour de la semaine    0-7 (0 ou 7 = dimanche, ou utiliser les noms)
   ...
   # s'exécute cinq minutes après minuit, tous les jours
   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 temporelle ou de date.

   # S'exécute une fois après le démarrage.
   @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.

   # S'exécute chaque minute aux intervalles de 0, 20 et 40 secondes
   * * * * *       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 faire l'une des trois choses suivantes:

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

    • éditez la crontab d'un utilisateur en tant que root avec crontab -e -u
    • ou éditez la crontab de l'utilisateur en cours avec simplement crontab -e
    • Vous pouvez définir l'éditeur avec la variable d'environnement EDITOR
      • env EDITOR=nano crontab -e -u
      • ou définir 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
  2. *créez un script/programme en tant que tâche cron, et ajoutez-le aux répertoires anacron du système `/etc/cron.ly`**

    • répertoires anacron du système /etc/cron.*ly:
      • /etc/cron.daily
      • /etc/cron.hourly
      • /etc/cron.monthly
      • /etc/cron.weekly
    • comme par exemple :
      • /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 d'anacron : man anacron
    • Rendre les scripts exécutables avec chmod a+x
    • À quelle heure ces scripts cron.*ly s'exécutent-ils?
      • Pour les systèmes Linux RHEL/CentOS 5.x, ils sont configurés dans /etc/crontab ou /etc/anacrontab pour s'exécuter à une heure définie
      • Les systèmes Linux RHEL/CentOS 6.x+ et Fedora 17+ ne définissent cela que dans /etc/anacrontab, et définissent cron.hourly dans /etc/cron.d/0hourly
  3. Ou, on peut créer des crontables système dans /etc/cron.d.

    • La syntaxe de crontab décrite précédemment (en fournissant également un utilisateur pour exécuter chaque tâche) est mise dans un fichier, et le fichier est placé dans le répertoire /etc/cron.d.
    • Il est facile de gérer ces tâches dans des paquets système (par exemple les paquets RPM), donc elles peuvent être généralement 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 d'heure/date et avant la commande à exécuter.
    • Les fichiers ajoutés à /etc/cron.d n'ont pas besoin d'être exécutables.
    • Voici un exemple de tâche qui est exécutée en tant qu'utilisateur someuser, et l'utilisation de /bin/bash comme shell est forcée.

      Fichier : /etc/cron.d/myapp-cron

      utilise /bin/bash pour exécuter les commandes, indépendamment de ce que /etc/passwd dit

      SHELL=/bin/bash

      Exécute une tâche cron nocturne (23h00) pour nettoyer les enregistrements de l'application

      00 23 * someuser /opt/myapp/bin/scrubrecords.php

8voto

dylanhockey Points 31

Guide rapide pour configurer une tâche cron

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

Pour chaque tâche quotidienne (00:00, 03:45), enregistrez les lignes de planification dans mycronjobs.txt

00 00 * * * ruby chemin/vers/votre/script.rb
45 03 * * * chemin/vers/votre/script2.sh

Envoyez les tâches à 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 tâches cron actuelles

crontab -l

Supprimer toutes les tâches cron

crontab -r

1 votes

Votre syntaxe de crontab est incorrecte pour 03h45. Les champs crontab sont Minute puis Heure, c'est-à-dire "45 03" - vous l'avez à l'envers dans votre message.

5voto

LV2014 Points 51

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

Comme ceci:

# haut du fichier crontab
CHEMIN=/home/nom_utilisateur/.rvm/gems/ruby-2.2.0/bin:/home/nom_utilisateur/.rvm/gems/ruby-2.2.0@global/bin:/home/nom_utilisateur/.rvm/rubies/ruby-2.2.$
GEM_PATH=/home/nom_utilisateur/.rvm/gems/ruby-2.2.0:/home/nom_utilisateur/.rvm/gems/ruby-2.2.0@global

# tâches
00 00 * * * ruby chemin/vers/votre/script.rb
00 */4 * * * ruby chemin/vers/votre/script2.rb
00 8,12,22 * * * ruby chemin/vers/votre/script3.rb

1voto

Modassir Haider Points 81

Vous pouvez exécuter un script shell de deux manières, soit en utilisant une tâche cron, soit en écrivant un script shell

Supposons que le nom de votre script est "votrescript.sh"

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

ll script.sh

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

sudo crontab -e

Deuxièmement, si le script appartient à 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 en arrière-plan

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

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

enregistrez-le dans un fichier (appelons-le "chaque-jour.sh")

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

maintenant donnez l'autorisation à votre script. utilisez la commande ci-dessous :

chmod +x chaque-jour.sh

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

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

nohup ./chaque-jour.sh &

Note : pour exécuter "votrescript.sh" à 23h55 tous les jours, vous devez exécuter le script "chaque-jour.sh" exactement à 23h55.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X