GNU/Linux >> Tutoriels Linux >  >> Linux

La bombe à fourche accidentelle :comment un script *nix tourne mal

L'un des premiers emplois que j'ai occupés dans l'industrie était chez un petit FAI régional. À l'époque, les modems 56k étaient brillants et nouveaux. Nous avions quelques douzaines de PoP (points de présence) où nous avons installé des banques de modems et renvoyé les données à notre bureau principal via une série de lignes T1 complètes et fractionnées.

Nous avons fourni la multitude de services typiques :e-mail, actualités sur Internet et accès général à Internet. Bien sûr, pour fournir ces services, nous avions besoin de nos propres serveurs. La solution consistait à mettre en place un cluster de systèmes SCO Unix. Oui, *ce* SCO. Cela fait un bon moment, mais une configuration de cluster comme celle-ci est difficile à oublier. Les serveurs ont été configurés de telle manière qu'ils avaient des dépendances les uns sur les autres. Si l'un d'entre eux échouait, tout ne s'effondrait pas, mais la sauvegarde de ce serveur nécessitait généralement de tout redémarrer.

La configuration générale était que le NFS des serveurs se montait au démarrage. Ceci, bien sûr, provoque une condition de concurrence lors du démarrage. Les ingénieurs avaient rédigé un document détaillé qui expliquait les étapes nécessaires pour faire remonter l'ensemble du cluster après une panne. L'ensemble du processus prenait généralement 30 à 45 minutes.

À l'époque, j'étais un modeste membre du support technique, passant la majorité de mon temps à accompagner de nouveaux clients tout au long du processus d'installation du logiciel nécessaire pour se connecter. J'étais relativement nouveau dans le monde d'Unix et des réseaux à haut débit et j'absorbais autant de connaissances que possible.

[ Vous pourriez également aimer : Points forts du terminal Linux :Aller au-delà de cowsay ]

L'une des personnes avec qui j'ai travaillé, Brett, m'a beaucoup appris. Il a écrit le système de surveillance du réseau que nous avons utilisé et a partagé son temps entre cela et le maintien du réseau opérationnel. Il était aussi parfois un peu farceur.

À la fin d'une journée assez typique, je me trouvais sur le cluster Unix. À l'improviste, ma connexion a échoué et j'ai été redémarré sur mon système d'exploitation local. C'était un peu bizarre, mais cela arrivait de temps en temps, alors je me suis simplement reconnecté. En quelques secondes, j'ai été de nouveau démarré.

J'ai commencé à faire un peu de débogage, essayant de comprendre ce qui se passait. Je ne me souviens pas de tout ce que j'ai fait, mais je me souviens d'avoir créé des scripts rapides pour me connecter, vérifier divers processus et essayer de comprendre ce qui se passait. À un moment donné, j'ai déterminé que j'étais démarré à partir du système par un autre utilisateur, Brett.

Une fois que j'ai compris ce qui se passait, j'ai dû me battre. J'ai donc commencé à jouer avec les scripts shell, en essayant de comprendre comment identifier le PID de son shell afin de pouvoir le démarrer hors ligne. Cela a fait des allers-retours pendant un moment, chacun de nous intensifiant les attaques. Nous avons commencé à utiliser d'autres services pour récupérer l'accès, lancer des attaques, etc.

Enfin, j'ai lancé ce que je pensais être l'attaque ULTIME. J'ai écrit un petit script shell qui recherchait son identifiant, identifiait le shell, puis supprimait son accès. Assez simple, mais j'ai ajouté la touche ultime. Une fois le script exécuté, il a exécuté une copie de lui-même. BOOM. Pas moyen qu'il revienne maintenant.

Et ça a marché ! Brett a perdu son accès et n'a tout simplement pas pu prendre pied au cours des cinq minutes suivantes environ. Et, bien sûr, j'avais mis la tâche en arrière-plan afin de pouvoir interagir avec la console et vérifier qu'il était battu. J'avais gagné. J'avais prouvé que je pouvais battre l'ingénieur expérimenté, et bon sang, je me sentais bien.

Jusqu'à...

ksh:fork :Ressource temporairement indisponible

Le début de la fin

Je n'avais jamais vu une telle erreur auparavant. Qu'est-ce que c'était? Pourquoi le système faisait-il cela ? Et pourquoi était-il diffusé partout sur ma console, ce qui m'empêchait de faire quoi que ce soit ?

[ Aide-mémoire gratuit :Conseils pour un entretien d'embauche en informatique ] 

Cela a pris quelques instants, mais Brett a également remarqué le problème. Il est sorti pour voir ce qui s'était passé. J'ai expliqué ma brillante stratégie, et il a simplement soupiré, souri et m'a dit que je devrais gérer le redémarrage et la resynchronisation des serveurs. Et puis il a pris le temps de m'expliquer ce que j'avais fait de mal. C'est le jour où j'ai découvert "exec" et à quel point c'est important.

Malheureusement, Brett est décédé environ une décennie plus tard. C'était un grand ami, un grand mentor, et il me manque.


Linux
  1. Comment rejouer les sessions de terminal enregistrées avec la commande de script Linux

  2. Comment obtenir l'adresse IP externe dans un script shell ?

  3. Comment obtenir la propre adresse IP et l'enregistrer dans une variable dans un script shell ?

  4. Comment chiffrer ou rendre le script shell illisible ?

  5. Comment arrêter le script Loop Bash dans le terminal ?

Comment je joue à Tetris sur le mainframe

Comment le bureau Linux s'est développé

Carrières d'administrateur système :la corrélation entre les mentors et le succès

Comment faire ressembler le bureau Plasma à Unity

Comment connaître le nom du fichier de script dans un script Bash ?

Comment obtenir le numéro d'affichage qui m'a été attribué par X