2009-06-08 7 views
0

Ich schreibe ein Skript, um die Plattennutzung auf einem System zu erfassen (ja, ich weiß, dass es Software gibt, die das tun kann). Für die Datenbankberichterstattung möchte ich, dass das Intervall zwischen Datenpunkten so gleich wie möglich ist. Wenn ich zum Beispiel alle 10 Minuten die Festplattennutzung abfrage, möchte ich, dass jeder Datenpunkt JJJJ-MM-TT HH lautet: [0-5] 0:00. Wenn ich alle 5 Minuten pollere, wäre es JJJJ-MM-TT HH: [0-5] [05]: 00.Erhalte ein Unix-Skript, das jedes Mal zur exakt gleichen Zeit ausgeführt wird

Wenn ich ein ksh - Skript (oder sogar ein Perl - Skript) habe, um die Festplattenbelegung zu erfassen, wie kann ich das Skript aktiv werden lassen und auf die nächste "Pollzeit" warten, bevor ich einen Snapshot mache korrekte Anzahl von Sekunden bis zur nächsten "Poll-Zeit". Wenn ich alle 5 Minuten abfrage, und es ist 11:42:00, dann möchte ich 180 Sekunden schlafen, damit es um 11:45:00 einen Schnappschuss macht - und dann für 5 Minuten schlafen, damit es einen weiteren Schnappschuss macht um 11:50:00 Uhr.

Ich schrieb einen Weg, der funktioniert, wenn meine Pollzeit alle 10 Minuten ist, aber wenn ich die Pollzeit auf eine andere Nummer ändere, funktioniert es nicht. Ich möchte, dass es in der Umfragezeit flexibel ist.

Ich bevorzuge dies in Shell-Skript, aber wenn es viel zu viel Code ist, wäre Perl auch in Ordnung.

Irgendwelche Ideen, wie dies zu erreichen ist?

Vielen Dank im Voraus!

Brian

EDIT: Wow - Ich habe einen ziemlich wichtigen Teil aus - dass cron deaktiviert ist, so dass ich cron nicht für diese Aufgabe nutzen können. Es tut mir sehr leid für all die Leute, die das als Antwort gegeben haben, denn ja, das ist der perfekte Weg, um das zu tun, was ich wollte, wenn ich Cron benutzen könnte.

Ich werde unseren Scheduler verwenden, um mein Skript jeden Tag vor Mitternacht zu starten, und ich möchte, dass das Skript genau zu den "Poll-Zeiten" läuft, dazwischen schläft und um Mitternacht beendet wird.

Noch einmal, es tut mir sehr leid, dass ich nicht über crontabs geklärt habe.

+0

Es sei denn, Sie verwenden einige Echtzeiterweiterungen, Sie können nicht * genau * zur gleichen Zeit erhalten, aber abhängig davon, was Sie brauchen, können Sie nahe genug sein. –

Antwort

2

getan Wenn ich dies tun würde, würde ich das System Scheduler (cron oder etwas anderes) verwenden, um zu planen Mein Programm läuft alle 180 Sekunden.

EDIT: Ich könnte Ihre Anfrage missverstanden haben. Suchst du mehr nach etwas in den folgenden Zeilen? (Ich vermute, es ist ein Bug oder zwei hier):

ANOTHER EDIT: Entfernen Sie die Abhängigkeit von Time :: Local (aber jetzt vermute ich mehr Fehler ;-)

#!/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 für die Antwort, da du genau richtig warst - allerdings habe ich in meinem Beitrag geklärt, dass ich cron nicht verwenden kann. Entschuldige, dass ich das in meiner Frage vergessen habe ... – BrianH

+0

Ja - genau das habe ich gesucht! Ksh wäre bevorzugt, aber ich denke, dass Perl am wenigsten Ärger sein wird. Vielen Dank! – BrianH

+0

@BrianH Nun, das einzige, was eine Abhängigkeit von Perl schafft, ist das Time :: Local-Modul. –

6

Cron wird den Job machen.

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

es einfach konfigurieren Sie Ihre KSH-Skript zu den Zeiten, die Sie ausführen müssen, und Sie sind

+0

+1 für die Antwort, da du genau richtig warst - allerdings habe ich in meinem Schnitt geklärt, dass ich Cron nicht verwenden kann. Entschuldigen Sie, dass ich das in meiner Frage weggelassen habe ... – BrianH

+1

Sie könnten eine einfache Java-Anwendung erstellen, die den Vorteil Quartz nutzt. Quarz hat alle Leitungen, um dies zu erreichen. Auch Spring hat einige nette Eigenschaften, um den Gebrauch von Quarz noch einfacher zu machen. – Reginaldo

1

es schon seit schlafen sehr kurze Zeit, < = 1 Sek., und prüfen Sie jedes Mal, ob die Poll-Zeit angekommen ist. Die inkrementelle Prozessornutzung ist vernachlässigbar.

Edit: Cron ist in Ordnung, wenn Sie wissen, welches Intervall Sie verwenden werden und nicht beabsichtigen, häufig zu ändern.Wenn Sie die Intervalle jedoch häufig ändern, sollten Sie ein kontinuierlich laufendes Skript mit kurzer Ruhezeit in Betracht ziehen.

+0

Das war, was ich tat, aber das erfordert eine Art harte Codierung der Pollzeiten, entweder in dem Programm, einer Datenbank oder einer Konfigurationsdatei. Ich denke, ich könnte einen Algorithmus schreiben, um alle Pollzeiten für einen Zeitraum von 24 Stunden zu berechnen, aber es scheint, als sollte es einen besseren Weg geben ... – BrianH

+0

Dann ist die Frage wirklich, welche Faktoren die Pollzeit bestimmen und unter welchen Umständen Würde es sich ändern? Wenn Sie die dumb-process Methode der harten Codierung überschreiten möchten, müssen Sie die Logik definieren. –

3

Sie könnten die Verwendung von cron in Betracht ziehen. Genau dafür wurde es gemacht.

+0

+1 für die Antwort da warst du genau richtig - allerdings habe ich in meinem Schnitt geklärt, dass ich cron nicht verwenden kann. Entschuldigung, dass ich das in meiner Frage vergessen habe ... – BrianH

0

Je nachdem, wie feingranular Ihre Zeitauflösung sein muss, müssen Sie möglicherweise Ihren Script-Daemon-Stil schreiben. Starten Sie es einmal, während (1) und machen Sie die Logik innerhalb des Programms (Sie können jede Sekunde überprüfen, bis es Zeit ist, wieder zu laufen).

Perls Zeit :: HiRes ermöglicht sehr feine Granularität, wenn Sie es brauchen.