Je veux exécuter un script une fois que la journée (et seulement le week-end), mais je ne peux pas utiliser le travail cron pour cela.
Je pensais avoir une infinie tandis que la boucle, dormir pendant 24 heures, vérifier si c'est Un week-end, et si cela exécute le script. p>
Qu'est-ce que c'est une bonne solution sous Bash sur Linux sur Linux? P>
Mes implémentation actuelle: P>
#! /bin/bash while [ true ]; do if [[ $(date +%u) -lt 6 ]]; then ./program else echo Today is a weekend, processing is skipped. Back to sleep. fi sleep 86400 done
5 Réponses :
Le problème avec l'utilisation d'un long Si vos administrateurs ne vous permettent pas d'utiliser Cependant, voici un contour approximatif: P> Sleep code> est que l'idée de votre programme à quelle heure il sera dériver. Il serait préférable de boucler avec des périodes code> courtes code> et de vérifier si vous êtes dans la fenêtre souhaitée.
cron Code>, ils peuvent ne pas être heureux que vous contourniez cette restriction. P>
while :
do
dow=$(date +%u)
if (( dow == 6 || dow == 7 ))
# you can check a flag or counter to limit the number of times it's performed
# or use a more refined date spec than just whole days (times of day, in other words)
then
do_something
sleep 1h # or use a smaller or larger interval
fi
done
Votre exécution do_something au moins 24 fois par jour le week-end. Un sommeil fixe de 24 heures ne fonctionnera pas car le sommeil peut retourner tôt.
C'est à peu près ce que je suis venu avec. Je vais le poster dans la question initiale
En supposant que vous ne puissiez vraiment pas utiliser les travaux de cron ou de planification pour planifier une boucle de sommeil. Les détails de la façon dont vous écrivez cela variera en fonction de vos besoins.
Si vous souhaitez uniquement exécuter une fois par jour, vous devez vous inquiéter de courts couchages. L'appel du système de sommeil qui est sous la plupart des langues La fonction de sommeil ne vous assure pas qu'il dormira la durée demandée. Votre programme pourrait dormir légèrement plus long que demandé ou beaucoup plus court que demandé. Vous pouvez planifier un sommeil pendant 24 heures, mais le système d'exploitation peut réveiller votre programme de délivrer un signal après quelques heures ou même après seulement quelques secondes. Si vous ne gardez pas la trace de la dernière exécution, ou votre prochaine exécution attendue que vous pouvez exécuter plusieurs fois par jour. P>
Si vous souhaitez exécuter à une heure précise, vous devrez faire varier la durée de votre sommeil. . Un sommeil partiel peut vous libérer d'une demi-journée et vous devrez dormir 12 heures pour revenir en synchronisation. P>
Vous devez rendre compte de la lumière du jour / heure d'été. Un jour par an aura 23 heures et une autre aura 25. p>
Vous pouvez utiliser quelque chose dans le sens de ce pseudocode: P>
set next_time_to_run loop forever sleep time_difference_in_seconds(current_time, next_time_to_run) if current_time is close to next_time_to_run execute code update next_time_to_run end if end loop
Pour une solution PERL, jetez un coup d'œil à Horaire :: cron Code>
module CPAN:
use 5.012; use warnings; use Schedule::Cron; my $cron = Schedule::Cron->new( sub {} ); # add weekend run @ 05:00 $cron->add_entry('0 5 * * Sat,Sun', sub { system './program'; }); $cron->run();
De retour dans la journée où il n'y avait pas de crontab par utilisateur, je l'ai souvent accompli avec (1).
day=Saturday if [ $(date +%u) -eq 6 ] ; then day=Sunday ; fi at -f /path/to/me 5pm next $day
Cron est une bonne solution. Pouvez-vous nous dire pourquoi vous ne pouvez pas l'utiliser?
Pourriez-vous élaborer vos contraintes? Un emploi "à" n'est probablement pas acceptable? Si le travail redémarre automatiquement après le redémarrage du serveur?
Je n'ai pas d'autorisations pour utiliser des tables cron. Supposons que ce serveur ne redémarre pas.
Avez-vous des autorisations à utiliser
à code> ou
lot code>?
Quelle précision devez-vous obtenir le timing de ces événements? Cela doit-il arriver à 17h00 sur le point ou une précision acceptable de 5 à 18 heures?
à tout moment après 5h à minuit =)