12
votes

Comment simuler un travail cron

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


6 commentaires

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 à ou lot ?


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 =)


5 Réponses :


1
votes

Le problème avec l'utilisation d'un long 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.

Si vos administrateurs ne vous permettent pas d'utiliser cron Code>, ils peuvent ne pas être heureux que vous contourniez cette restriction. P>

Cependant, voici un contour approximatif: 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


2 commentaires

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



1
votes

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


0 commentaires

5
votes

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();


0 commentaires

0
votes

Vous pouvez utiliser Snaked . Il est similaire à Cron, mais écrit à Perl.


0 commentaires

11
votes

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


0 commentaires