RSYNC depuis AIX vers Linux

Ce billet aurait pu s’intituler “mes aventures dans le monde AIX” ou bien “comment faire du nohup sur AIX” mais se serait être malhonnête car laisserait croire que tous mes problèmes venaient de cet OS propriétaire. Pour être exact le contexte était celui d’un transfert de fichiers depuis une machine AIX 5.3 vers un Linux Cent OS.

Je ne pensais pas que j’allais être confronté à tant de subtilités. Si certaines sont imputables à la limite de mes connaissances en scripting, d’autres ont pour cause les différences entre le monde merveilleux de Linux et celui de AIX.

En premier lieu voici la liste des contraintes imposées par des besoins fonctionnelles, des contraintes de sécurités et des raisons pratiques.

  • c’est AIX qui pilote le transfert: la sécurité impose ce sens de flux
  • les fichiers les plus récents  doivent être copiés en premier: besoin fonctionnel
  • seul les fichiers de moins d’un certain âges seront copiés: contrainte fonctionnelle.
  • la commande de transfert doit être en nohup: raison pratique car le transfert va être long.

Le chemin fut semé d’embûches avant d’arriver à mes fins dont la plupart vient des spécificités du système AIX.

La première difficulté est venue du tri pour obtenir les fichiers les plus récents en premier. Sous Linux on fait un find avec un printf suivi d’un sort

find . -type for -ctime -1460 -printf "T@ %p\n" | sort -r | awk '{print $(NF)}'

pas de printf dans la fin de AIX

la clé NF pour le awk non plus ou conséquence du point precendent

J’avais envie d’utiliser l’option exec du find en lui passant un stat comme ceci

find . -type for -ctime -1460 -exec stat -c '%Y %n' {} \; | sort -r | awk '{print $(2)}'

Pas de stat sous AIX

Malheureusement la commande stat n’existe pas sous AIX et la commande qui s’en rapproche n’a pas la même fonctionnalité. La solution est de passer par une commande perle dans le exec du find

find . -type for -ctime -1460 -exec perl -e '@tmp=stat ($ARGV [0]); print "$tmp [10]\t $ARGV [0]\n";' | sort -r | awk '{print $(2)}'

Mon dieu que c’est compliqué ! Et je n’étais pas au bout de mes peines.

Nohup et pipe

Le lecture ajoutera de lui même un pipe supplémentaire pour faire le rsync. Là n’est pas la question…. quoique on verra plus tard. Il s’agit surtout de mettre toutes ces commandes en nohup. Comme

nohup cmd1 | cmd2

ne porte le nohup que sur cmd1 l’idée est de passer par un seul sous she’ll qui sera vu comme une seule commande.

nohup $SHELL<<EOF &
find . -type for -ctime -1460 -exec perl -e '@tmp=stat ($ARGV [0]); print "$tmp [10]\t $ARGV [0]\n";' | sort -r | awk '{print $(2)}'
EOF

Ceci fonctionne bien sous Linux et il suffit de remplacer les commandes compliquées par un sleep mais sous AIX ?

Pas de sous shell avec le nohup AIX

La documentation IBM AIX disponible sur Internet est formelle. Si le nohup AIX prend en argument une et une seule commande. La seule moyen est de passer un script qui sera vu comme une commande pour le nohup.

nohup sh mon_script.sh

Rsync

Apres les difficultés liées à AIX j’avais également oublié de faire un échange de clé car en nohup on ne pourra pas saisir de mot de passe. Cela n’a rien à voir avec l’AIX, j’étais seulement absorbé sur les spécificités de l’AIX que j’en ai oublié cette subtilité.

Juste pour le plaisir… CC-BY-SA