Cron läuft alle 15 Sekunden

18

Könnten Sie mir raten, was ich schreiben soll crontab, damit /usr/bin/chromium-browseralle 15 Sekunden ein Auftrag ausgeführt wird (zum Testen, den ich verwenden werde )?

xralf
quelle
Verlassen Sie sich statt auf crontab auf ein anderes Event-Management-System, zum Beispiel: Perls every.pm-Modul hilft Ihnen dabei.
Nikhil Mulley

Antworten:

27

Mit cron können Sie die Granularität von einer Minute nicht unterschreiten. Sie können jede Minute ein Skript ausführen, das Ihren Job ausführt, 15 Sekunden wartet und die Ausführung wiederholt. Die folgende Crontab-Linie startet some_joballe 15 Sekunden.

* * * * * for i in 0 1 2; do some_job & sleep 15; done; some_job

In diesem Skript wird davon ausgegangen, dass der Auftrag nie länger als 15 Sekunden dauert. Das folgende etwas komplexere Skript sorgt dafür, dass die nächste Instanz nicht ausgeführt wird, wenn die Ausführung zu lange gedauert hat. Es hängt von der dateUnterstützung des %sFormats ab (z. B. GNU oder Busybox, damit Sie unter Linux in Ordnung sind). Wenn Sie es direkt in eine Crontab einfügen, beachten Sie, dass %Zeichen wie \%in einer Crontab-Zeile geschrieben werden müssen.

end=$(($(date +%s) + 45))
while true; do
  some_job &
  [ $(date +%s) -ge $end ] && break
  sleep 15
  wait
done
[ $(date +%s) -ge $(($end + 15)) ] || some_job

Ich werde jedoch bemerken, dass cron wahrscheinlich der falsche Ansatz ist, wenn Sie einen Job alle 15 Sekunden ausführen müssen. Obwohl Unices mit kurzlebigen Prozessen gut umgehen können, kann der Aufwand für das Starten eines Programms alle 15 Sekunden nicht vernachlässigbar sein (je nachdem, wie anspruchsvoll das Programm ist). Können Sie Ihre Anwendung nicht ständig ausführen und alle 15 Sekunden ausführen lassen?

Gilles 'SO - hör auf böse zu sein'
quelle
könnte auch sein: für i in 1 2 3 4 ; do some_job & sleep 15; done(der letzte Schlaf wirkt sich nicht auf den nächsten Lauf aus), aber die Art und Weise, wie Sie dies tun, ist wahrscheinlich besser für das Timing der ausgehenden Cronjob-Mail (direkt nach dem letzten some_job gesendet, intead von 15s später in meine Variante)
Olivier Dulac
13

Anderer Ansatz als die anderen: Führen Sie 4 Cronjobs aus, die jeweils um 15 Sekunden versetzt sind:

* * * * * sleep 00; timeout 15s some_job
* * * * * sleep 15; timeout 15s some_job
* * * * * sleep 30; timeout 15s some_job
* * * * * sleep 45; timeout 15s some_job

Um zu verhindern, dass der Job sich selbst stört, begrenzen wir seine Laufzeit über GNU coreutils ' timeoutfür jeden Job auf 15 Sekunden . Beachten Sie jedoch, dass Sie möglicherweise immer noch Probleme haben, wenn der Job nach Ablauf von 15 Sekunden nicht ordnungsgemäß beendet wird. Einzelheiten zur Behebung eines Problems finden Sie im Befehlshandbuch. Beachten Sie auch, dass Sie, wenn der Befehl länger als 15 Sekunden dauert und das Timeout ihn beendet, einen Beendigungsstatus ungleich Null erhalten, der eine Cronjob-E-Mail auslöst.

Otheus
quelle
Genial, wenn auch sich wiederholend.
Mike Kormendy
1
Nett. Wenn ein Prozess lange läuft, würde der nächste wahrscheinlich auch auf einem anderen Kern enden. Wir sind uns nicht sicher, ob Sie die Kernaffinität für Cron-Jobs gezielt festlegen können, aber dies könnte diesen Ansatz noch verbessern.
Tim
@ Tim guter Punkt. Ich habe das etwas in einer Bearbeitung angesprochen.
Otheus
2

Kurz gesagt, Cron ist mit der Zeit nicht so körnig. Die kürzeste Zeit, die Sie bekommen, ist 1 Minute.

#       .---------------- minute (0 - 59)
#       |       .------------- hour (0 - 23)
#       |       |       .---------- day of month (1 - 31)
#       |       |       |       .------- month (1 - 12) OR jan,feb,mar,apr ...
#       |       |       |       |       .----- day of week (0 - 6) (Sunday=0 or 7)  OR sun,mon,tue,wed,thu,fri,sat
#       |       |       |       |       |
#       *       *       *       *       *       command to be executed
        *       *       *       *       /usr/bin/chromium-browser

Sie könnten jedoch ein Skript schreiben, das alle 15 Sekunden ausgeführt wird ...

Rfelsburg
quelle
Ich habe eine Zeile * * * * * /usr/bin/chromium-browserin Crontab. Laut Handbuch sollte es jede Minute laufen, aber es läuft nichts.
Xralf
Ist es schwierig, ein solches Skript zu schreiben? Soll ich eine andere Frage stellen oder könnte sie hier geschrieben werden?
Xralf
Cron-Jobs haben kein Terminal, daher würde ich davon ausgehen, dass der Browser ausfällt. Es kann so leise tun.
BillThor
Meine Cron-Protokolle befinden sich in / var / log / cron für Derivate von RedHat, dh. fedora, centos etc. Es kann auch hilfreich sein, genau zu beschreiben, was Sie versuchen, damit die Leute ein vollständiges Bild davon haben, was los ist.
Rfelsburg
1

In Ihrer Crontab:

* * * *  /usr/bin/chromium-browser_starter

Dann in /usr/bin/chromium-browser_starter:

#!/bin/sh

# chromium-browser_starter
#
# Schedules /usr/bin/chromium-browser to run every 15 seconds for a minute.
# Intended to be called every minute through crond(8).

for ((secs=0; secs<46; secs+=15)); do
    (sleep $secs; /usr/bin/chromium-browser "$@") &
done

wait
Amphetamachine
quelle
Wenn ich ps aux | grep chromnach einer Minute schreibe, sehe ich keinen laufenden Chrom-Browser.
Xralf
@xralf - Das Skript wird höchstens einige Sekunden ausgeführt. Versuchen Sie, nach etwas zu greifen sleep.
Amphetamachine