2009-06-08 9 views
0

J'écris un script pour capturer l'utilisation du disque sur un système (oui, je sais qu'il existe un logiciel qui peut le faire). Pour les besoins de la base de données, je souhaite que l'intervalle entre les points de données soit le plus égal possible. Par exemple, si je consulte l'utilisation du disque toutes les 10 minutes, je veux que chaque point de données soit AAAA-MM-JJ HH: [0-5] 0:00. Si je suis en train d'interroger toutes les 5 minutes, ce serait AAAA-MM-JJ HH: [0-5] [05]: 00. Si j'ai un script ksh (ou même un script Perl) pour capturer l'utilisation du disque, comment puis-je laisser le script actif et attendre le prochain "Temps d'interrogation" avant de prendre un instantané, puis dors le nombre correct de secondes jusqu'à la prochaine "heure d'interrogation". Si je suis en train d'interroger toutes les 5 minutes, et qu'il est 11:42:00, alors je veux dormir pendant 180 secondes, donc ça prendra un instantané à 11:45:00 - et puis je dors pendant 5 minutes donc ça prendra un autre instantané à 11:50:00.Obtenir un script Unix à exécuter exactement au même moment à chaque fois

J'ai écrit un moyen qui fonctionne si mon temps d'interrogation est toutes les 10 minutes, mais si je change le temps d'interrogation à un nombre différent, cela ne fonctionne pas. J'aimerais que ce soit flexible sur le temps du scrutin.

Je préfère faire cela dans un script shell, mais si c'est beaucoup trop de code, Perl irait bien aussi.

Des idées sur la façon d'accomplir cela?

Merci d'avance!

Brian

EDIT: Wow - Je laisse une partie très importante - que Cron est désactivé, donc je ne vais pas être en mesure d'utiliser pour cette tâche Cron. Je suis vraiment désolé pour tous ceux qui ont donné cette réponse, parce que oui, c'est le moyen idéal pour faire ce que je voulais, si je pouvais utiliser cron. Je vais utiliser notre planificateur pour lancer mon script juste avant minuit tous les jours, et je veux que le script gère la course aux heures exactes du sondage, dormant entre les deux, et se terminant à minuit.

Encore une fois, je suis désolé de ne pas avoir clarifié sur crontabs.

+0

Sauf si vous utilisez des extensions en temps réel, vous ne pouvez pas obtenir * exactement * la même heure, mais en fonction de ce dont vous avez besoin, vous pouvez être assez proche. –

Répondre

2

Si je fais cela, j'utiliser le planificateur système (cron ou autre chose) pour planifier mon programme pour courir toutes les 180 secondes.

EDIT: J'ai peut-être mal compris votre demande. Cherchez-vous plus pour quelque chose le long des lignes suivantes? (Je soupçonne qu'il ya un bug ou deux ici):

AUTRE EDIT: Supprimer la dépendance sur le temps :: Local (mais maintenant je soupçonne que plus de bugs ;-)

#!/usr/bin/perl 

use strict; 
use warnings; 

use POSIX qw(strftime); 

my $mins = 5; 

while (1) { 
    my ($this_sec, $this_min) = (localtime)[0 .. 1]; 

    my $next_min = $mins * (1 + int($this_min/$mins)); 
    my $to_sleep = 60 * int($next_min - $this_min - 1) 
       + 60 - $this_sec; 

    warn strftime('%Y:%m:%d %H:%M:%S - ', localtime), 
     "Sleeping '$to_sleep' seconds\n"; 

    sleep $to_sleep; 
} 

__END__ 
+0

+1 pour la réponse puisque vous étiez exactement exact - cependant, j'ai clarifié dans mon édition que je ne peux pas utiliser cron. Désolé de laisser cela dans ma question ... – BrianH

+0

Oui - c'est exactement ce que je cherchais! ksh serait préféré, mais je pense que Perl va finir par être le moins de tracas. Merci beaucoup! – BrianH

+0

@BrianH Eh bien, la seule chose qui crée une dépendance sur Perl est le module Time :: Local. –

6

cron fera le travail.

http://en.wikipedia.org/wiki/Cron

Il suffit de le configurer pour exécuter votre script ksh au moment dont vous avez besoin et vous avez terminé

+0

+1 pour la réponse puisque vous étiez exactement exact - cependant, j'ai clarifié dans mon édition que je ne peux pas utiliser cron. Désolé de laisser cela dans ma question ... – BrianH

+1

Vous pouvez créer une application Java simple qui tire avantage de Quartz. Quartz a toute la plomberie pour y parvenir. Aussi Spring a quelques fonctionnalités intéressantes pour rendre l'utilisation de Quartz encore plus facile. – Reginaldo

1

faites-le dormir pour une très court temps, < = 1 sec, et vérifier à chaque fois si l'heure d'interrogation est arrivée. L'utilisation incrémentielle du processeur sera négligeable.

Éditer: cron est très bien si vous savez quel intervalle vous utiliserez et n'avez pas l'intention de changer fréquemment.Mais si vous changez souvent les intervalles, considérez un script en cours d'exécution w/short sleep time.

+0

C'est ce que je faisais, mais cela nécessite une sorte de codage dur des temps d'interrogation, que ce soit dans le programme, une base de données ou un fichier de configuration. Je suppose que je pourrais écrire un algorithme pour calculer tous les temps de sondage pour une période de 24 heures, mais il semble qu'il devrait y avoir un meilleur moyen ... – BrianH

+0

Ensuite, la question est vraiment, quels facteurs déterminent le temps du scrutin, et dans quelles circonstances cela changerait-il? Si vous voulez transcender la façon de coder en dur, vous devrez définir la logique. –

3

Vous voudrez peut-être envisager d'utiliser cron. C'est exactement ce pour quoi il a été fait.

+0

+1 pour la réponse puisque vous étiez exactement exact - cependant, j'ai clarifié dans mon édition que je ne peux pas utiliser cron. Désolé d'avoir laissé ça dans ma question ... – BrianH

0

En fonction de grains fins résolution de votre temps doit être, il peut y avoir un besoin d'écrire votre style de démon script. Commencez une fois, tandis que (1) et faites la logique dans le programme (vous pouvez vérifier chaque seconde jusqu'à ce qu'il soit temps de courir à nouveau).

Temps de Perl :: HiRes permet une granularité très fine si vous en avez besoin.