Créer un pipe Unix entre 2 serveurs

Soyons clair, ce qui suit est loin d’avoir la pureté de AQ, JMS ou même d’une socket TCP. C’est beaucoup moins robuste aussi ! Mais, s’il vous arrive de lancer des programmes sur plusieurs serveurs Unix/Linux simultanément et que vous voulez suivre l’évolution de tous ces programmes, sans vous casser la tête, vous pouvez simplement transporter les données d’un pipe nommé sur une machine au stdout ou un autre pipe nommé sur une autre machine :

Avant de lancer vos programmes

  • Créez un pipe nommé sur vos machines qui émettront les informations avec la commande mknod
server1$ mknod /tmp/server1 p
server2$ mknod /tmp/server2 p
  • Il faut que vous ayez une configuration ssh correcte (daemons, clés publiques et clés privées) sur chacun des serveurs. Vous voudrez pouvoir faire un ssh depuis le serveur qui affiche les données vers les serveurs qui les émettent sans que vous ayez à entrer un mot de passe. Pour cela, enregistrez les clés publiques de l’utilisateur de machine sur laquelle vous allez afficher le résultat dans les fichiers dans les fichiers ~/.ssh/authorized_keys des machines émettrices.
server1$ ssh server3 "cat ~/.ssh/id_dsa.pub" >> ~/.ssh/authorized_keys
user3@server3's password :
server1$ ssh server3 "cat ~/.ssh/id_rsa.pub" >> ~/.ssh/authorized_keys
user3@server3's password :
server2$ ssh server3 "cat ~/.ssh/id_dsa.pub" >> ~/.ssh/authorized_keys
user3@server3's password :
server2$ ssh server3 "cat ~/.ssh/id_rsa.pub" >> ~/.ssh/authorized_keys
user3@server3's password :
  • Lancer les commandes ssh sur le serveur d’affichage de sorte qu’elles dépilent les informations des pipes des serveur émetteurs et les affichent sur le stdout :
server3$ nohup ssh server1 "while true;do cat /tmp/server1; done" &
server3$ nohup ssh server2 "while true;do cat /tmp/server2; done" &

Remarques :
Vous pouvez rediriger le contenue des pipes des serveurs émetteurs vers un fichiers sur server3 ou vers un fichier avec « >> » comme ceci :

server3$ nohup ssh server1 "while true;do cat /tmp/server1; done" >>output.log &

Vous pouvez également utiliser « | tee » pour afficher simultanément les contenus à l’écran et dans un fichier ou un autre pipe.

Lancer les programmes sur vos machines émettrices

Il ne reste plus qu’à lancer vos programmes sur les serveurs émetteurs et à envoyer les sorties sur les pipes nommés locaux. Pour une démonstration simple, vous pouvez, par exemple utilisez echo :

server1$ echo "test" >/tmp/server1

Le mot test doit s’afficher sur l’écran du serveur récepteur.

Arrêter tout…

Sur le serveur récepteur, visualisez les ssh en cours et arrêtez-les avec la commande kill -9 comme ci-dessous :

server3$ $ ps -ef |grep [s]sh|grep while
user3 19147 18715 0 23:01 pts/1 00:00:00 ssh user1@server1 while t...
server3$ kill -9 19147

Au fait, à cause de la boucle, « while true », vous pouvez éventuellement perdre des messages aussi alors utilisez cette technique quand ça a du sens.

Message personnel :
« pipe sh » = futur problème !

1 réflexion sur “Créer un pipe Unix entre 2 serveurs”

  1. Pour copier des fichiers de cette manière « cpio -o » est un des mots cles qu’il faut mettre dans Google !

Les commentaires sont fermés.