Nadejdą ciepłe sierpnie



A poranna poczta poinformuje, że skrypt wywołany przez cron skasował wszystkie tegoroczne snapshoty systemów plików. Zamiast usunąc tylke te starsze niż kwartał.

Fatalny skutek spowodowany był dwiema okolicznościami:

  • solarisowy date jest bardzo prosty, nie obsługuje podawania daty wyrażeniami typu "4 months ago", przez co trzeba stosować shellową arytmetykę;
  • powłoka traktuje liczby poprzedzone zerem jako zapisane w formacie ósemkowym
Wszystko było dobrze w czasie testowania skryptu na początku roku i przez dłuższy czas jego działania. Aż tu nagle (znieniacka!) przyszedł sierpień i date +%m zwróciło 08. Przy dalszych operacjach shell zaprotestował, że nie jest to poprawna liczba ósemkowa i nie wykonał odejmowania i przypisania. Skrypt wykonał się dalej, ale z listy snapshotów nie wyciągnął tych zawierających człon 2007-04 (wykonanych w kwietniu). Usunięte zostały snapy pasujące do 2007-, czyli wszystkie. zfs destroy wykonało się radośnie po 120 razy na każdym nadzorowanym systemie plików.

Poprawka skryptu jest polega na poinformowaniu powłoki, że ma do czynienia z liczbą w zapisie dziesiętnym:

-MONTH=$(printf "%02d" $((MONTH - 4)))
+MONTH=$(printf "%02d" $((10#${MONTH} - 4)))
I wydaje się działać. Tak jak pół roku temu wydawało się :). Zaraz chyba zabiorę się za napisanie test suite do tego skryptu.

Swoją drogą akcja opowiadania Raya Bradburego, z którego zaczerpnąłem tytuł, toczy się również na początku sierpnia. Feralny miesiąc?


Archived comments:

mwi 2007-08-01 13:27:59

Dobry motyw, nie powiem. :P Ja bym od razu mu urwał to feralne 0:
MONTH=${MONTH#0}

zdz 2007-08-01 13:33:39

O, dobry patent, dzięki.

Piotr Hosowicz 2007-08-01 16:48:37

Ooops ... To coś jak moje :

# killall jakis-program

... wykonane na AIXie. Na szczęście na serwerze developerskim :-D Pod Solarisem skutek byłby zdaje się podobny jak pod AIXem, nie próbowałem.

Stanisław 'dozzie' Klekot 2007-08-01 19:38:19

A to ci psikus z tym date. A wystarczyło `set -e' na początku skryptu...

Comments


Comments powered by Disqus