Wie kann ich Perl mitteilen, dass alle 20 Sekunden ein Code ausgeführt wird?Wie kann ich Perl sagen, dass er alle 20 Sekunden einen Code ausführen soll?
Antwort
while (1) {
sleep 20;
<your code here>;
}
for (;;) {
my $start = time;
# your code;
if ((my $remaining = 20 - (time - $start)) > 0) {
sleep $remaining;
}
}
Upvote: leidet nicht unter Drift. – daxim
@daxim Es leidet unter Drift, wenn der '#your code' Teil länger als 20 Sekunden dauert. Um Drift zu vermeiden, müsste es "sleep (($ interval - (time - $ start))% $ interval) sein, wobei $ interval 20 ist. –
@daxim Natürlich leidet das an einer möglichen Abweichung von nur einer Sekunde pro Zwanzig. –
Während die sleep
Funktion für einige Anwendungen funktionieren wird, wenn Sie versuchen, „alle 20 Sekunden, für immer“ zu tun, dann sind Sie besser dran wie cron
ein externes Programm.
Zusätzlich zu dem bereits erwähnten Problem der Drift, wenn Ihr sleep
Skript (erwartet oder nicht) ausläuft, wird es bei der nächsten 20-Sekunden-Marke nicht erneut ausgeführt.
@blrfl ist richtig, und ich fühle mich schüchtern. Das heißt, es ist leicht genug zu überwinden.
* * * * * /path/to/script.pl
* * * * * sleep 20 && /path/to/script.pl
* * * * * sleep 40 && /path/to/script.pl
könnten Sie auch einen Hybrid-Ansatz von einer begrenzten Zählung Schlafschleife im Skript setzen und mit dem Cron es alle X Minuten laufen, den Fall von Skript Tod abdeckt. Etwas häufiger als 20 Sekunden, würde ich definitiv diesen Ansatz nehmen.
POSIX 'cron' macht keine Sub-Minuten-Auflösung. – Blrfl
eine SIGALRM Handler, Einstellungen und selbst ein Signal alle 20 Sekunden mit alarm
(siehe perldoc -f alarm) senden:
$SIG{ALRM} = sub {
# set up the next signal for 20 seconds from now
alarm 20;
# do whatever needs to be done
# ...
};
Diese Drift im Laufe der Zeit erfahren werden, da jedes Signal um bis zu einem zweiten verzögert werden kann, ; Wenn dies wichtig ist, richten Sie stattdessen einen Cron-Job ein. Darüber hinaus wird noch mehr Drift auftreten, wenn Ihr anderer Code mehr als 20 Sekunden zum Ausführen benötigt, da nur ein Timer gleichzeitig zählen kann. Sie könnten das umgehen, indem Sie Threads erzeugen, aber zu diesem Zeitpunkt wäre ich bereits zu einer einfachen Cron-Lösung zurückgekehrt.
Die Auswahl der richtigen Lösung hängt davon ab, welche Art von Aufgabe Sie regelmäßig ausführen müssen, die Sie nicht angegeben haben.
Siehe Schedule::ByClock:
#!/usr/bin/perl
use strict; use warnings;
use Schedule::ByClock;
my $scheduler = Schedule::ByClock->new(0, 20, 40);
while (defined(my $r = $scheduler->get_control_on_second)) {
printf "%02d\n", $r;
}
Alle Einsprüche andere gelten weiterhin darauf hingewiesen, aber ich denke, das Modul ordentlich ist.
@BugShotGG Sie benötigen auch einen Computer, auf dem Perl ausgeführt wird. –
Gehen Sie mit ..
while() {
sleep 20;
#Code here
}
#!/usr/bin/perl -w
use strict;
# heartbeat
$SIG{ALRM} = sub {
# set up the next signal for 20 second from now
alarm(20);
printf "<heartbeat/>\n";
};
alarm(20); # start timer
my $i = 0;
while(1) {
$i++;
printf "loop" . $i . "\n";
sleep 2;
}
alarm(0);
printf "done!\n";
Ausgang:
loop1
loop2
loop3
loop4
loop5
loop6
loop7
loop8
loop9
loop10
<heartbeat/>
loop11
loop12
loop13
loop14
loop15
loop16
loop17
loop18
loop19
loop20
<heartbeat/>
Wahrscheinlich werden einige Anmerkungen begrüßt. Freundliche Grüße – YakovL
- 1. Wie kann ich sagen, dass .hover() warten soll?
- 2. Sagen Sie dem Server, dass er den Code nicht ausführen soll, wenn ein Fehler auftritt
- 3. Wie kann ich CKeditor sagen, dass er ohne Formatierung einen neuen Absatz erstellen soll?
- 4. Kann ich sagen, dass bash einen Befehl ausführen soll, nachdem der gerade ausgeführte Befehl abgeschlossen wurde?
- 5. Wie kann ich Travis sagen, dass er alle Git-Submodule nicht mitnimmt?
- 6. Wie kann ich dem MinGW-Linker mitteilen, dass er nicht alle Symbole exportieren soll?
- 7. Code alle 10 Sekunden ausführen, aber auch 0 Sekunden starten
- 8. Kann ich Findbugs sagen, dass ich Klassen ignorieren soll, die ich nicht hinzufügen kann?
- 9. Kann ich einen Code in Perl definieren?
- 10. Wie kann ich sicherstellen, dass alle meine Python-Code "kompiliert"?
- 11. Wie kann ich einem DataProvider mitteilen, dass er aktualisiert werden soll?
- 12. Wie kann ich jQuery sagen, dass eine Funktion nur auf einer bestimmten Webseite ausgeführt werden soll?
- 13. Wie soll ich einen Code-Generator testen?
- 14. Wie kann ich einen Systembefehl in Perl asynchron ausführen?
- 15. Wie schreibe ich einen URLClassLoader in Java, so dass er vor dem Laden bestimmter Klassen einen Codeblock ausführen kann?
- 16. Wie kann ich von Perl erzeugten Perl-Code verschönern?
- 17. Wie bekomme ich alle paar Sekunden einen Standort?
- 18. Wie kann ich Django sagen, dass es meine Testdatenbank speichern soll?
- 19. XMLEventWriter: Wie kann ich sagen, dass es leere Elemente schreiben soll?
- 20. Bild alle 20 Sekunden ändern Javascript mit Zeilen
- 21. Wie kann ich meinem benutzerdefinierten FragmentPagerAdapter mitteilen, dass er meine Fragmente nicht mehr zerstören soll?
- 22. Wie kann ich jaxb/Maven sagen, dass es mehrere Schema-Pakete generieren soll?
- 23. Wie kann ich Devise sagen, dass es seine Ansichten in einem anderen Layout rendern soll?
- 24. Wie kann ich einen Perl-Hash im C-Code erstellen?
- 25. Wie kann ich Perl-Code verstecken?
- 26. Wie kann ich meinen Taschenrechner so einrichten, dass er weiterläuft?
- 27. Wie funktionieren '20 Sekunden 'in Scala?
- 28. Wie kann ich meinen Perl-Code auf mehrere Dateien aufteilen?
- 29. Kann ich dem Eclipse-Debugger sagen, dass er zum vorherigen Schritt zurückkehrt?
- 30. Replay ein .swf nach 20 Sekunden
Um die Menschen nach unten stimmrechts diese Frage, stoppen und um es für ein paar Minuten denken. Eine einfache Antwort wie "Schlaf 20;" ist nur eine Teillösung. –
@Chas. - Das Problem ist, dass die Frage das nicht explizit spezifiziert (siehe Ether/Blrfl Kommentare zur Antwort). Daher ist die Frage schlecht, auch wenn das, was gefragt wird, nicht ist. – DVK
@DVK Ja, es gibt alle Arten von Komplikationen, die auftreten (sollte der Code alle 20 Sekunden mit Überlappungen, ohne Überlappungen, an Zwanzig-Sekunden-Grenzen, an der 0., 20. und 40. Sekunde einer Minute usw. ausgeführt werden). Dies sind alles Verbesserungen an der Frage, die benötigt werden, aber Downstimmen werden nicht die Verfeinerungen erhalten, besonders ohne dass jemand kommentiert, warum es keine sehr gute Frage ist. –