J'ai vu quelques solutions, y compris regarder et simplement exécuter un script en boucle (et en veille) en arrière-plan, mais rien n'a été idéal.
J'ai un script qui doit s'exécuter toutes les 15 secondes, et comme cron ne prend pas en charge les secondes, je suis obligé de trouver autre chose.
Quel est le moyen le plus robuste et le plus efficace d'exécuter un script toutes les 15 secondes sous Unix? Le script doit également s'exécuter après un redémarrage.
Réponses:
J'utiliserais cron pour exécuter un script toutes les minutes, et je le ferais exécuter votre script quatre fois avec un sommeil de 15 secondes entre les exécutions.
(Cela suppose que votre script est rapide à exécuter - vous pouvez ajuster les temps de sommeil sinon.)
De cette façon, vous bénéficiez de tous les avantages
cron
ainsi que de votre période d'exécution de 15 secondes.Edit: Voir aussi le commentaire de @ bmb ci-dessous.
la source
Si vous insistez pour exécuter votre script depuis cron:
et remplacez votre nom de script et le chemin vers / foo / bar / votre_script
la source
* * * * * sleep 15; php /foo/bar/your_script
#!/usr/bin/php
en haut de votre script php et le rendre exécutableVersion modifiée de ce qui précède:
ajouter à / etc / crontab:
la source
Est-ce que cela ne fonctionne pas en arrière-plan?
C'est à peu près aussi efficace que possible. La partie importante n'est exécutée que toutes les 15 secondes et le script s'endort le reste du temps (donc pas de cycles de perte).
la source
&
à la fin de la ligne 3. En tout cas, tel quel, cela ne s'exécute pas toutes les 15 secondes. Cela s'exécute toutes les "15 secondes + quel que soit le tempsecho hello
de fonctionnement". Ce qui pourrait être 0,01 seconde; pourrait durer 19 heures.J'ai écrit un ordonnanceur plus rapidement que cron. J'ai également mis en place une garde de chevauchement. Vous pouvez configurer le planificateur pour ne pas démarrer de nouveau processus si le précédent est toujours en cours d'exécution. Jetez un œil à https://github.com/sioux1977/scheduler/wiki
la source
Utilisez nanosleep (2) . Il utilise une structure
timespec
qui est utilisée pour spécifier des intervalles de temps avec une précision de l'ordre de la nanoseconde.la source
la source
Depuis ma réponse précédente, j'ai trouvé une autre solution qui est différente et peut-être meilleure. Ce code permet aux processus d'être exécutés plus de 60 fois par minute avec une précision de l'ordre de la microseconde. Vous avez besoin du programme usleep pour que cela fonctionne. Devrait être bon jusqu'à 50 fois par seconde.
la source
Pour éviter d'éventuels chevauchements d'exécution, utilisez un mécanisme de verrouillage comme décrit dans ce thread .
la source