Maison  >  Article  >  Opération et maintenance  >  Comment faire en sorte que Crontab exécute une tâche toutes les secondes

Comment faire en sorte que Crontab exécute une tâche toutes les secondes

coldplay.xixi
coldplay.xixioriginal
2020-07-06 16:29:017328parcourir

Comment faire en sorte que Crontab exécute une tâche toutes les secondes

Comment faire en sorte que Crontab exécute une tâche toutes les secondes

Crontab est un fichier de configuration de planification planifiée sous Linux. Grâce à lui, nous pouvons exécuter des programmes système, des scripts, des commandes et des tâches à des heures définies. ., fonctionnement par intervalles et cycles. La plus petite granularité temporelle dans Crontab est de quelques minutes. En d'autres termes, grâce à la configuration de Crontab, nous pouvons exécuter la tâche cible au maximum une fois par minute. Une exécution plus fréquente n'est pas possible et nous ne pouvons utiliser que d'autres méthodes.

Recommandations d'apprentissage associées : Tutoriel vidéo Linux

Par exemple, que devez-vous faire si vous souhaitez qu'un programme soit exécuté toutes les 30 secondes ?

Il existe encore des solutions de contournement. Une idée est d'ajouter deux configurations dans Crontab, l'une est destinée à la planification normale et est exécutée une fois par minute, et l'autre consiste à attendre 30 secondes avant de s'exécuter.

# Need these to run on 30-sec boundaries, keep commands in sync.
* * * * *              /path/to/executable param1 param2
* * * * * ( sleep 30 ; /path/to/executable param1 param2 )

Cette méthode semble un peu raide et bizarre, mais elle fonctionne. Cette méthode peut en fait être abrégée en une seule ligne :

* * * * * /bin/bash -l -c "/path/to/executable; sleep 30 ; /path/to/executable"

Une autre méthode consiste à utiliser la commande watch :

$ watch --interval .30 script_to_run_every_30_sec.sh

Mais watch est un outil en ligne de commande, nous pouvons utiliser nohup permet de l'exécuter en arrière-plan.

Minuterie SystemD

Si le système Linux que nous utilisons possède SystemD, nous pouvons utiliser la minuterie SystemD pour planifier des programmes à tout moment avec une granularité qui peut théoriquement être aussi petite que le niveau de la nanoseconde - bien sûr , C'est un peu fou de faire ça. En bref, sa flexibilité dans la planification des tâches est bien supérieure à celle de Cron - il n'est pas nécessaire d'utiliser des solutions boiteuses comme

sleep.

Par rapport à crontab qui complète la configuration en une seule ligne, établir un timer SystemD est légèrement plus compliqué, mais afin de mieux implémenter la planification des tâches avec une granularité inférieure à « par minute », cette méthode vaut la peine d'être essayée.

Le principe de mise en œuvre du timer SystemD est simplement composé de deux parties : un service système et un timer SystemD. Le minuteur SystemD effectue la planification et les tâches sont écrites en service.

Voici un exemple simple. L'objectif est de faire en sorte que l'enregistreur système affiche "Hello World" toutes les dix secondes ;

/etc/systemd/system/helloworld.service

[Unit]
Description=Say Hello
[Service]
ExecStart=/usr/bin/logger -i Hello World

/etc/systemd/system/helloworld.timer

[Unit]
Description=Say Hello every 10 seconds
[Timer]
OnBootSec=10
OnUnitActiveSec=10
AccuracySec=1ms
[Install]
WantedBy=timers.targethelloworld.timer里并没有声明service的名称,那它和service是如何关联的呢?没错,因为它们的名称相同,都是helloworld。

Si vous souhaitez que l'ensemble du système utilise cette minuterie, ces deux fichiers doivent être placés dans

/etc/systemd/system. Si vous souhaitez l'utiliser pour un certain utilisateur, placez-le dans ~/.config/systemd/user. Si vous souhaitez que ce minuteur s'exécute immédiatement, vous devez exécuter la commande suivante : La balise –now

dans

systemctl enable --now helloworld.timer
entraîne l'exécution immédiate du minuteur. Dans le cas contraire, l'opération ne sera déclenchée qu'après le redémarrage du système ou la connexion de l'utilisateur. Les fonctions de chaque champ de la section

[Timer] sont les suivantes :

  • OnBootSec – Combien de secondes après le système commence à commencer la planification
  • OnUnitActiveSec – L'intervalle de temps pour la planification répétée des services associés. C'est cette ligne de configuration qui détermine les actions planifiées comme la tâche cron.
  • AccuracySec – Précision de la minuterie. La valeur par défaut est d'une minute, très similaire à cron. Il peut s'avérer nécessaire d'être plus élevé, mais la précision accrue entraînera une plus grande consommation du système et réveillera le processeur plus fréquemment. La configuration ci-dessus indique 1 ms, ce qui n'est évidemment pas une décision judicieuse. Habituellement, nous pouvons le régler sur 1 (1 seconde), ce qui est suffisant pour répondre à nos exigences de précision de minuterie avec une granularité temporelle inférieure à 1 minute. Pour cette raison, nous verrons que la sortie du message "Hello World" est souvent retardée d'environ 1 seconde lorsque le programme lui-même est en cours d'exécution. Si vous ne pensez pas que le retard de cette seconde environ constitue un problème, voici comment il doit être réglé.
Vous constaterez que le minuteur SystemD et le minuteur Crontab ne sont pas les mêmes - la période de planification des tâches n'est pas définie en fonction de la période de l'année, du mois, du jour, de l'heure et des minutes, elle est basée sur notre premier time Il démarre au moment de son exécution, en ajoutant un cycle de temps à chaque fois. Si nous aimons la méthode de configuration de l'heure comme Crontab, le timer SystemD la prend également en charge, alors nous devons supprimer

OnBootSec et OnUnitActiveSec et les remplacer par OnCalendar, comme suit est un exemple :

OnCalendar=*-*-* *:*:00,10,20,30,40,50

Enfin, par défaut, le timer et le service SystemD sont associés au même nom. Si vous le souhaitez, vous pouvez également le configurer dans le

[Timer] Pair by. en précisant le champ Unité.

Les méthodes ci-dessus peuvent toutes réaliser des tâches de planification planifiées avec une granularité inférieure à la minute. Chacun a ses avantages. Les minuteries SystemD semblent plus formelles, mais un peu plus complexes. Bien que la méthode Crontab+

sleep soit délicate, elle n'est pas incompétente pour certaines petites tâches.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn