Si vous pouvez enregistrer un fichier d'horodatage entre les exécutions, vous pouvez vérifier sa date au lieu de vous fier uniquement à la date actuelle.
Si votre commande find prend en charge des valeurs fractionnaires pour -mtime
(ou a -mmin
) ( GNU find a les deux , POSIX ne semble pas en avoir besoin non plus ), vous pouvez `` étrangler '' les tâches cron avec find et touch .
Ou, si vous avez une commande stat qui prend en charge l'affichage des dates de fichier en «secondes depuis l'époque» (par exemple, stat de Gnu coreutils , également d'autres implémentations), vous pouvez faire votre propre comparaison en utilisant date , stat et les opérateurs de comparaison du shell (avec avec touche pour mettre à jour un fichier d'horodatage). Vous pouvez également être en mesure d'utiliser ls au lieu de stat s'il peut effectuer le formatage (par exemple, ls de GNU fileutils ).
Ci-dessous se trouve un programme Perl (je l'ai appelé n-hours-ago
) qui met à jour un fichier d'horodatage et se termine avec succès si l'horodatage d'origine était assez ancien. Son texte d'utilisation montre comment l'utiliser dans une entrée crontab pour limiter une tâche cron. Il décrit également les ajustements pour «l'heure d'été» et comment gérer les horodatages «tardifs» des exécutions précédentes.
#!/usr/bin/perl
use warnings;
use strict;
sub usage {
printf STDERR <<EOU, $0;
usage: %s <hours> <file>
If entry at pathname <file> was modified at least <hours> hours
ago, update its modification time and exit with an exit code of
0. Otherwise exit with a non-zero exit code.
This command can be used to throttle crontab entries to periods
that are not directly supported by cron.
34 2 * * * /path/to/n-hours-ago 502.9 /path/to/timestamp && command
If the period between checks is more than one "day", you might
want to decrease your <hours> by 1 to account for short "days"
due "daylight savings". As long as you only attempt to run it at
most once an hour the adjustment will not affect your schedule.
If there is a chance that the last successful run might have
been launched later "than usual" (maybe due to high system
load), you might want to decrease your <hours> a bit more.
Subtract 0.1 to account for up to 6m delay. Subtract 0.02 to
account for up to 1m12s delay. If you want "every other day" you
might use <hours> of 47.9 or 47.98 instead of 48.
You will want to combine the two reductions to accomodate the
situation where the previous successful run was delayed a bit,
it occured before a "jump forward" event, and the current date
is after the "jump forward" event.
EOU
}
if (@ARGV != 2) { usage; die "incorrect number of arguments" }
my $hours = shift;
my $file = shift;
if (-e $file) {
exit 1 if ((-M $file) * 24 < $hours);
} else {
open my $fh, '>', $file or die "unable to create $file";
close $fh;
}
utime undef, undef, $file or die "unable to update timestamp of $file";
exit 0;