Könnten Sie mir raten, was ich schreiben soll crontab
, damit /usr/bin/chromium-browser
alle 15 Sekunden ein Auftrag ausgeführt wird (zum Testen, den ich verwenden werde )?
Könnten Sie mir raten, was ich schreiben soll crontab
, damit /usr/bin/chromium-browser
alle 15 Sekunden ein Auftrag ausgeführt wird (zum Testen, den ich verwenden werde )?
Antworten:
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_job
alle 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 date
Unterstützung des %s
Formats 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?
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)
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 ' timeout
fü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.
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 ...
* * * * * /usr/bin/chromium-browser
in Crontab. Laut Handbuch sollte es jede Minute laufen, aber es läuft nichts.
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
ps aux | grep chrom
nach einer Minute schreibe, sehe ich keinen laufenden Chrom-Browser.
sleep
.