Wie kann ich cron festlegen, um alle eineinhalb Stunden bestimmte Befehle auszuführen?Wie kann ich festlegen, dass Cron alle eineinhalb Stunden bestimmte Befehle ausführt?
Antwort
Gibt es einen guten Grund, warum Sie nicht 1 Stunde oder 2 Stunden verwenden können? Es wäre sicherlich einfacher.
ich dies persönlich nicht versucht haben, aber Sie können einige Informationen hier auf immer cron finden alle 90 Minuten laufen zu lassen: http://keithdevens.com/weblog/archive/2004/May/05/cron
Einen excert aus dem obigen Link:
0 0,3,6,9,12,15,18,21 * * * <commands>
30 1,4,7,10,13,16,19,22 * * * <commands>
das nicht möglich ist mit einem einzigen Ausdruck in normalen cron
.
Das Beste, was Sie ohne Änderung der Code tun können, ist:
0 0,3,6,9,12,15,18,21 * * * [cmd]
30 1,4,7,10,13,16,19,22 * * * [cmd]
Diese könnte komprimierbar sein, abhängig von der Version von cron Sie haben:
0 */3 * * * [cmd]
30 1-23/3 * * * [cmd]
Zwei Linien in der crontab. Entlang der Linien:
0 0,3,6,9,12,15,18,21 * * * /usr/bin/foo
30 1,4,7,10,13,16,19,22 * * * /usr/bin/foo
Sie könnten es mit zwei crontab Einträgen tun.Jeder läuft alle drei Stunden und werden von 90 Minuten so etwas wie dieses Offset:
0 0,3,6,9,12,15,18,21 * * *
30 1,4,7, 10,13,16,19,22 * * *
Sie könnten auch fcron verwenden, die auch komplexere Zeitangaben wie akzeptiert:
@ 01h30 my_cmd
#! /bin/sh
# Minute Cron
# Usage: cron-min start
# Copyright 2014 by Marc Perkel
# docs at http://wiki.junkemailfilter.com/index.php/How_to_run_a_Linux_script_every_few_seconds_under_cron"
# Free to use with attribution
# Run this script under Cron once a minute
basedir=/etc/cron-min
if [ $# -gt 0 ]
then
echo
echo "cron-min by Marc Perkel"
echo
echo "This program is used to run all programs in a directory in parallel every X minutes."
echo
echo "Usage: cron-min"
echo
echo "The scheduling is done by creating directories with the number of minutes as part of the"
echo "directory name. The minutes do not have to evenly divide into 60 or be less than 60."
echo
echo "Examples:"
echo " /etc/cron-min/1 # Executes everything in that directory every 1 minute"
echo " /etc/cron-min/5 # Executes everything in that directory every 5 minutes"
echo " /etc/cron-min/13 # Executes everything in that directory every 13 minutes"
echo " /etc/cron-min/90 # Executes everything in that directory every 90 minutes"
echo
exit
fi
for dir in $basedir/* ; do
minutes=${dir##*/}
if [ $((($(date +%s)/60) % $minutes)) -eq 0 ]
then
for program in $basedir/$minutes/* ; do
if [ -x $program ]
then
$program &> /dev/null &
fi
done
fi
done
hinzugefügt folgendes meine crontab und arbeitet
15 */1 * * * root /usr/bin/some_script.sh >> /tmp/something.log
Könnten Sie mehr darüber erfahren, warum dies eine gute Lösung ist? –
*/10 * * * * root perl -e 'exit(time()%(90*60)>60)' && command
90 - es ist eine und eine halbe Stunde in Minuten
"> 60" - Ich gebe Fähigkeit cron den Start-Skript während einer Minute
auch zu verzögern Mit Hilfe dieses Hacks können Sie einen beliebigen Zeitraum mit einer Minutenauflösung einstellen
Zum Beispiel starten Sie das Skript alle 71 Minuten
* * * * * root perl -e 'exit(time()%(71*60)>60)' && command
Sie eine beliebige Frequenz erreichen können, wenn Sie die Minuten (, Stunden, Tage oder Wochen), da Epoch, fügen Sie eine Bedingung an die Spitze des Skripts, und legen Sie das Skript zählen jede Minute auf dem crontab laufen :
#!/bin/bash
minutesSinceEpoch=$(($(date +'%s/60')))
# every 90 minutes (one and a half hours)
if [[ $(($minutesSinceEpoch % 90)) -ne 0 ]]; then
exit 0
fi
date(1)
kehrt das aktuelle Datum, wir es als Sekunden seit der Epoche (%s
) formatiert und dann tun wir grundlegende Mathematik:
# .---------------------- bash command substitution
# |.--------------------- bash arithmetic expansion
# || .------------------- bash command substitution
# || | .---------------- date command
# || | | .------------ FORMAT argument
# || | | | .----- formula to calculate minutes/hours/days/etc is included into the format string passed to date command
# || | | | |
# ** * * * *
$(($(date +'%s/60')))
# * * ---------------
# | | |
# | | ·----------- date should result in something like "1438390397/60"
# | ·-------------------- it gets evaluated as an expression. (the maths)
# ·---------------------- and we can store it
A Und Sie können diesen Ansatz mit stündlichen, täglichen oder monatlichen Cron-Aufträgen verwenden:
#!/bin/bash
# We can get the
minutes=$(($(date +'%s/60')))
hours=$(($(date +'%s/60/60')))
days=$(($(date +'%s/60/60/24')))
weeks=$(($(date +'%s/60/60/24/7')))
# or even
moons=$(($(date +'%s/60/60/24/656')))
# passed since Epoch and define a frequency
# let's say, every 7 hours
if [[ $(($hours % 7)) -ne 0 ]]; then
exit 0
fi
# and your actual script starts here
Hallo stefanmaric, da Sie in der Sache fest zu sein scheinen, fügen Sie die Antwort nur zu einer der Fragen hinzu und kennzeichnen Sie diejenigen, die echte Duplikate sind, als Duplikate der besten Frage/Antwort-Kombination. – bummi
Hi @bummi, ich habe tatsächlich nach der Funktion "Als Duplikat markieren" gesucht. Ich habe es nicht gefunden, also habe ich gepostet. Ich habe seit meinem Kommentar mehr Forschung betrieben und herausgefunden, dass ich nicht genug Reputation habe, um Fragen zu beantworten: http://meta.stackexchange.com/questions/118124/where-on-earth-is-the-mark-duplicate-ui-on -stack-overflow Danke für den Hinweis und es tut mir leid wegen der Spam. – stefanmaric
Welche Anforderung? Der erste Satz stellt die Notwendigkeit von 1,5 Stunden in Frage, der zweite stellt einen Blogeintrag mit Informationen darüber bereit, wie es alle 1,5 Stunden gemacht wird. – vfilby
Upvoted, weil der Blogpost die Frage richtig beantwortet. –
Es hat nicht eindeutig darauf hingewiesen, als ich es abgelehnt habe. Es wurde seither bearbeitet, um deutlich zu machen, dass die Verbindung zu einer möglichen Lösung für die 90-Minuten-Frage führt. – Alnitak