Script rapide pour changer l'heure et la date d'une tâche

Gazette Linux n°103 — Juin 2004

Willy Smith

Article paru dans le n°103 de la Gazette Linux de juin 2004.

Traduction française par Joëlle Cornavin .

Relecture de la traduction française par Encolpe Degoute .

Article publié sous Open Publication License. La Linux Gazette n'est ni produite, ni sponsorisée, ni avalisée par notre hébergeur principal, SSC, Inc.


Dans le paquetage at standard, nous n'avons trouvé aucun outil permettant de modifier l'heure d'une tâche at si jamais nous soumettons accidentellement à cette tâche un jour ou une heure incorrects. S'il y existe un outil de ce type, utilisez-le mais dans le cas contraire, ce script devrait suffire. En voici le source :

 
#!/bin/ksh
if [[ "`id -u`" -ne "0" ]]

then
   
   print "Vous devez exécuter cet utilitaire en tant que 'root'."
   
   exit 1

elif [[ "x$1" = "x" ]] || [[ "x$2" = "x" ]]

then

   print "Usage: `basename $0`  "

   print "Example: `basename $0` \"2004-05-20 04:00\" \"Thu May 20 18:00:00 2004\""

   exit 1

fi

I=0

J=0

TMP=/var/tmp/at

AT_SPOOL=/var/spool/at

TO=$((`date +%s -d "$2"` / 60))

set -A JOBS `atq | sort | grep -A100 "$1" | awk '{print $1}'`

set -A FILES `cd $AT_SPOOL ; find  -type f \! -name '.*' | sed 's/^\.\///g'`

test -d $TMP || mkdir -m 0700 -p $TMP

while [[ $I -lt ${#JOBS[*]} ]]

do

   J=0

   p=`echo "obase=16;${JOBS[I]}" | bc | tr A-Z a-z`

   while [[ $J -lt ${#FILES[*]} ]]

   do

      f=${FILES[J]}

      if [[ "`echo $f | cut -b 4-6`" = "$p" ]]

      then

         J=${#FILES[*]}

         h=`echo $f | cut -b 7- | tr a-z A-Z`

         d=`echo "ibase=16;$h" | bc`

         h=`echo "obase=16;$TO" | bc | tr A-Z a-z`

         n="`echo $f | cut -b 1-6`$h"

         TO=$(($TO + 60))

         echo "Déplacer $AT_SPOOL/$f to $AT_SPOOL/$n"

         cp -f $AT_SPOOL/$f $TMP/$f

         chmod 0600 $TMP/$f

         mv -f $AT_SPOOL/$f $AT_SPOOL/${n}

      fi

      J=$(($J + 1))

   done

   I=$(($I + 1))

done

echo "Tous les changements ont été effectués. Vérifiez les sauvegardes dans $TMP et lancez 'atq' pour afficher les modifications."
exit 0

Petite note sur son utilisation :

 
atmv {from} {to}

Où les arguments from et to sont bien sûr les ancienne et nouvelle date et heures. Les deux ont des formats légèrement différents — pour de bonnes raisons.

Le premier argument from a le même format date+heure que la colonne 2 de la commande atq :


$ atq | sort

1397    2004-05-26 18:00 a mail

Qui est aaaa-mm-jj HH:MM

Le second argument to est formaté de la même manière que la sortie de la commande date :

 
$ date

Wed May 26 10:35:48 BST 2004

Mais avec l'omission du fuseau horaire.

Voici un exemple :

 
$ atmv "2004-05-<20 04:00" "Thu May 20 18:00:00 2004"

Cette commande déplacera tous les travaux programmés de 4 h le 20 mai à 18 h le même jour, y compris toutes les tâches soumises après 16 h également :


$ atq | sort

1402    2004-05-27 00:00 a mail

1403    2004-05-27 01:00 a mail

1404    2004-05-27 02:00 a mail

1405    2004-05-27 03:00 a mail

1406    2004-05-27 04:00 a mail

$ atmv '2004-05-27 02:00' 'Fri May 28 17:30:00 2004'

$ atq | sort

1402    2004-05-27 00:00 a mail

1403    2004-05-27 01:00 a mail

1404    2004-05-28 17:30 a mail

1405    2004-05-28 18:30 a mail

1406    2004-05-28 19:30 a mail

Comme vous pouvez le voir, il ne fournit qu'un incrément d'une heure entre deux déplacements. C'est tout ce que nous lui demandions, mais naturellement, comme je vais donner le code ici, changez-le selon vos souhaits, améliorez-le ou rendez-le plus souple. Il crée des sauvegardes des fichiers at originels sous /var/tmp/at en cas de problème.