Puis-je rendre cron «aléatoire»?


12

Peut-être que je suis complètement fou, et si c'est le cas - ça va. Mais comment pourrais-je planifier un travail pour diffuser sur un calendrier aléatoire un message maladroit, comme à partir de fortune?

clarification
oui - c'est mon poste de travail personnel - je ne prévois pas de faire quelque chose de bizarre sur un serveur de production :)

Réponses:


12

ata une interface plus simple pour ce type de but si atest installé, la machine est en marche atdet l'utilisateur est autorisé à utiliser la commande.

Par exemple (vérifiez la syntaxe exacte avec man atou info at),

at -f fichier now + 53 minutes

ou

at -f fichier now + 2 hours

exécutera les commandes dans le fichier spécifié en 53 minutes ou 2 heures, respectivement.

at peut ensuite être réexécuté au début du travail planifié avec des unités de démarrage, de comptage et de temps appropriées (aléatoires ou non).

Éditer

Comme Arjan le souligne utilement ci-dessous, si vous l'utilisez pour une application autre qu'un jouet, vous devez penser à des problèmes tels que ce qui se passe

  1. si la prochaine exécution commence avant la fin de la précédente (par exemple, le script est-il réentrant?) ou

  2. si une exécution ne se termine pas correctement ou

  3. si le cycle suivant ne démarre pas du tout ou à temps (par exemple, que se passe-t-il si la machine est éteinte au moment du démarrage du cycle suivant) et

  4. sur la journalisation et le rapport des exécutions échouées ou réussies.


c'est une approche que je n'avais pas envisagée - et qui pourrait être récursive, si elle filecontient la prochaine atexécution, n'est -ce pas?
warren

génial - vient de l'essayer et fonctionne très bien :)
warren

2
+1, mais quelques points à considérer: si la atcommande-est la première ligne et si le script s'exécute pendant une longue période (ou si les intervalles sont courts), alors méfiez-vous de l'exécution simultanée de plusieurs instances. Mais quand se attrouve à la dernière ligne du script, alors évidemment aucune nouvelle programmation ne sera effectuée si le script échoue. De plus, l'exécution du script à partir de la ligne de commande le fera (re) planifier lui-même (et: plusieurs planifications pourraient alors exister simultanément). Et cronprend en charge l'envoi de toute erreur (ou: sortie en général) par e-mail; Je ne sais pas si ata aussi quelque chose comme ça?
Arjan

@ Arjan - Je ne suis pas trop inquiet à ce sujet ne me et non l' envoi d' un e - mail .. depuis (à ce stade) Je suis juste l' utiliser pour avoir du plaisir sur mon poste de travail :) ..however - c'EST quelque chose à penser si cela était étendu à, disons, un contrôle aléatoire d'intrusion
warren

le script que j'envisage ne se souciera pas du nombre de copies de lui-même en cours d'exécution
warren

13

J'ai de nombreuses commandes dans / etc / crontab faisant toutes sortes de choses et certaines ont besoin de précision en quelques secondes. Maintenant, cron peut avoir une résolution plus fine tout en gardant tous les temps visibles et centralisés.

Cet exemple obtient et analyse une page Web entre 10 et 50 secondes avant toutes les 5 minutes:

4-59/5 * * * * root (sleep $(($RANDOM\%40+10))) && /etc/munin/plugins/someplugin prefetch

Il n'a pas besoin d'avoir une heure exacte car les données sont lentes, mais cela aide à maintenir le temps d'exécution des nœuds munin aussi bas que possible en évitant d'attendre les pages Web. (Le plugin met en cache la page pendant 30 minutes pour réduire les accès inutiles, mais doit mettre à jour une base de données toutes les 5 minutes).

Notez que \% - cron remplace% par "\ n" - utile pour garder le texte du courrier sur une seule ligne.


si vous mettez les pages Web en cache, vous n'obtiendrez pas nécessairement des résultats de chargement précis
warren

1
oui, je sais - «les données sont lentes» - le plugin obtient les taux de change d'un site et je ne veux pas être banni. (Je ne suis pas un commerçant mais je passe beaucoup de temps à regarder des graphiques munin) J'ai fait un plugin similaire pour la météo locale. Des applications infinies!
Andy Lee Robinson

1
aha! .. approche très cool :)
warren

6

En interne cron, je ne pense pas qu'une telle fonctionnalité existe. Je pense que la meilleure solution serait de placer votre commande dans un script shell, de placer un sleepintervalle aléatoire en haut du script et d'utiliser la $RANDOMvariable. Exécutez ensuite le script une fois par jour dans une tâche cron régulière.

#!/bin/bash
sleep $(($RANDOM%5))
/path/to/command -param1 -param2

1
sleep () est presque une garantie qu'il sera tué par le fournisseur de services. Sauf bien sûr, il EST le fournisseur de services.
Un nain

1
J'ai supposé que c'était sur sa propre machine Linux ou quelque chose si il présentait la fortune au hasard à quelqu'un
John T

c'est vrai.
Un nain

Pourquoi dormir est une mauvaise idée? Je demande juste ...
Tadeusz A. Kadłubowski

a clarifié la question pour @John T
warren

6

Cela dépendra du type d'intervalle que vous recherchez. mais supposons que vous souhaitiez que le script s'exécute de manière aléatoire avec une probabilité de 1h30 (une fois toutes les 30 minutes)

  • Construisez votre script cron pour une périodicité de, disons, 10 minutes. Il se déclenchera 3 fois toutes les 30 minutes.

  • Dans le script, utilisez rand comme condition pour une instruction if . Vous voulez que rand renvoie un nombre compris entre 0 et 2. S'il vaut 0, exécutez le contenu de l'instruction if.

Essentiellement, votre script se déclenche toujours à un intervalle défini. Mais n'exécutera que la commande qui vous intéresse au hasard. Votre fournisseur de services vous en remerciera.


@A Dwarf - merci aussi pour cette idée - ce serait un itinéraire légèrement plus utile si je voulais vérifier les intrusions, etc. sur une base fréquente mais quasi aléatoire
warren
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.