nb=$( ps -fu root | grep “mon_programme” | grep -v grep | wc -l ) … FAILED 2/2

Alors Luke, as-tu réussi à résoudre cette énigme?

Bien, bien, bien, deuxième round sur notre ligne de code pour compter le nombre d’instances de mon_programme par lui même. Alors, qui a fait le coup ?

And the winner is…

$()

La substitution de commandes ! Aussi simple ou bizarre que cela puisse paraître, le problème provient de ce mécanisme. Pourquoi ?
Dans le précédent billet, je précisais qu’une substituions de commandes crée un sous-shell qui porte le nom du shell parent. Dans notre cas, mon_programme va donc lancer un sous-shell lui aussi nommé mon_programme pour exécuter les commandes inclues dans le $() afin de récupérer la sortie standard de la dernière commande.

C’est aussi bête que cela mais réaliser une observation dans un contexte perturbe ce même contexte et, ici, de manière à tromper l’observation elle-même.

Mais encore ?

Les informations captées par ps sont ici la source du problème. Lorsque nous lançons notre programme mon_programme, nous sommes assurés que le ps le verra ainsi que toute autre instance déjà présente. Mais nous pourrons aussi voir des instances supplémentaire avec cet appel à un sous-shell où s’exécuteront  justement la commande ps et les filtres qui s’ensuivent.
Hélas, le résultat restant imprévisible, cela reste définitivement une façon de faire à proscrire.

Chemins de traverse

Certains commentaires ont proposés des solutions élégantes MAIS, AIX n’est pas Linux, et la version de ps disponible n’a par exemple pas l’option -C pour faciliter notre existence.

Post-mortem

L’approche autopsie est intéressante, à savoir faire une simple commande ps qui écrira un fichier puis le manipuler, afin de ne pas perturber le phénomène par son observation. C’est lent, mais c’est sûr.

ps -fu root >mon_programme.tmp
nb=$( grep -c mon_programme mon_programme.tmp )

C’est la technique à privilégier en cas de reprise d’un existant douteux puisque l’approche ci-dessous suppose d’avoir opté préalablement pour une traçabilité du programme.

Petit Poucet

Une solution est d’utiliser un fichier qui contiendrait le PID, l’identifiant numérique de chaque programme qui est actuellement connu du système. C’est une solution élégante et courante mais qui impose de traiter un cas de figure supplémentaire, à savoir l’existence d’un fichier PID mais sans programme en cours d’exécution, par exemple du à l’arrêt inopiné de celui-ci (NDLA : et non, lockfile n’est pas disponible nativement sous AIX mais oui, utiliser un fichier pour le PID, c’est le bien !).

A tout prendre, celle-ci a ma préférence au vu de son usage très courant et très sûre, puisque l’on peut même gérer les cas de plantage a priori.

Going offline

En fait, la méthode d’une approche totalement à chaud est à bannir et l’usage de marqueurs comme un PID file devrait être plus qu’une habitude mais un automatisme. Si vous ne l’avez jamais fait, lisez les fichiers de démarrage des daemons sur Unix/Linux, le plus souvent dans /etc/init.d pour voir comment le statut est vérifié, c’est très formateur.

Quant à moi, je prêcherai de mon mieux dans le monde “professionnel” pour qu’enfin les empilements de grep cessent de corrompre la vision du monde ;)

nb=$( ps -fu root | grep “mon_programme” | grep -v grep | wc -l ) … FAILED 1/2

Bon voici un billet sans doute “technique” pour qui n’en fait pas du tout mais il est assez simple, si, si promis, et représentatif d’un problème courant sur les serveurs, à savoir qu’un programme vérifie à son lancement qu’il n’est pas déjà lancé afin d’éviter des collisions dans le traitement de son activité.
L’idée est donc de compter le nombre d’instances et de prendre nos décisions sur cette base et c’est LA ligne en charge de cette activité que je propose pour analyse.

Il m’a été inspiré par les deux heures de parlottes dans mon open-space d’autres personnes dont j’ai fini par voir un peu marre et que j’ai donc aidées à résoudre ce problème.
Pour les fans du docteur Layton, sortez votre haut de forme !

Filtres

En Unix, il existe de nombreux programmes que l’on nomme filtre car ils n’ont d’autre usage que de “tamiser” un contenu selon nos besoins. Donc réellement leurs actions sur le système sont nulles, elles ne changent pas la résolution de l’affichage à l’écran ni ne permettent de récupérer les “cables” américains… tout au plus de les trier ;)

grep

Un des plus fameux filtres, il permet de rechercher une séquence de caractère paramétrable et de signaler son absence, sa présence, éventuellement son nombre d’occurrence, ça dépend des options souhaitées. Un exemple, si grep recherchait le mot “chat” dans le fichier fic1 donc le contenu serait le suivant:

Le chat mange des os
Le chien mange des poissons

grep me retournerait par défaut :

# grep chat fic1
Le chat mange des os

L’option ‘-v‘, qui apparait dans la seconde occurrence, permet elle de filtrer à l’envers, à savoir ne retenir que les lignes où la chaîne n’apparait. Dans le cas de fic1 et de la recherche précédente, nous aurions:


# grep -v chat fic1
Le chien mange des poissons

wc

Non pas le canard, encore un autre filtre qui signifie en fait “Word Count” et donc compte les mots, les caractères et les lignes. L’option ‘-l‘ lui demande de n’indiquer que le nombre de lignes lues. Sur notre fic1, cela donnerait :

# wc -l fic1
2 /tmp/fic1

Commandes

Là, il s’agit de programme qui ont une réelle capacité à obtenir des informations du système ou de le modifier. Ici, une seule suffit au vu du but annoncé, à savoir ce qui est en train de tourner !

ps

Là encore, cette commande a une signification à savoir “process status”. C’est un peu comme le gestionnaire des tâches de windows, on sait ce qui fonctionne, qui le fait fonctionner, etc
Les options ici sont assez simples ‘-f‘ pour full afin que la commande nous offre un listing complet et ‘-u‘ pour limiter néanmoins ce listing à l’utilisateur root, à savoir l’administrateur système1.

Shell

Bon, tous nos commandes et nos filtres, ne vivent pas dans le néant et ce qui permet de les saisir, c’est ce qu’on appelle le shell, littéralement une coquille. Dans le monde Unix IBM, par défaut, c’est un shell plaisamment appelé Korn Shell 88, vous pouvez headbanger.

Ce shell a la gentillesse d’offrir la gestion des variables, à savoir associer un identifiant à une valeur, les pipes, à savoir faire de la plomberie pour brancher une suite de programmes entre eux, et la substitution de commandes avec $(), qui permet de remplacer le contenu entre les parenthèses par les valeurs retournées par les programmes qu’elle contient. Mais développons brièvement.

Variables

C’est un incontournable en programmation impérative, on donne des noms plus ou moins clairs à ces variables et on leur assigne une valeur. Selon le langage, on peut avoir à se soucier du typage, à savoir si notre variable doit, par exemple contenir, un nombre ou un caractère mais le shell est permissif sur ce point.

L’affectation du contenu d’une variable se fait avec le signe “=“. Notre billet ici présent raconte donc l’histoire de l’affectation d’une certaine valeur à ‘nb‘.

Pipes

On ne rigole pas…

Ce concept au nom amusant est une évolution majeure du shell Unix, même si celle-ci date, et permet de faire communiquer des programmes entre eux sans devoir passer par de l’écriture sur disque. Si nous repensons à nos filtres, qui permettent donc de filtrer un contenu, il y a donc une entrée et une sortie. Le pipe fait que la source est le programme situé avant et que la sortie se fait sur le programme d’après.

La conséquence est que l’ensemble des commandes chaînées s’exécute quasi-simultanément pour profiter de ce mécanisme.

Notre chaînage assure donc que la liste des processus sera filtrée 3 fois (grep/grep/wc), et que le premier grep ne s’arrêtera pas avant que ps n’ait terminé, ni que le second grep ne s’arrêtera avant que le premier grep n’est terminé, je vous laisse déduire pour wc ;)

Substitution de commandes

Conclusion logique, nous cherchons à allouer à ‘nb‘ une valeur, à savoir celle obtenue par la succession de nos commandes que nous aurons permis les fameux pipes et cette magique substitution de commandes.

Pour réaliser cette action, les commandes destinées à être substituées sont lancées dans un sous-shell qui porte le nom du shell parent.

And now…

Bien, cette ligne apparait donc dans le script mon_programme dont nous souhaitons, rappelons le, qu’il s’assure qu’une instance de lui même ne s’exécute pas déjà.

Maintenant, le ver est déjà dans le fruit, la valeur retournée ne sera pas la bonne. Quant au pourquoi, je laisse mes amiEs geeks cogiter un peu, proposer des réponses, sous 2-3 jours je dirais tout le mal que je pense de cette façon de faire ;)

  1. tout puissant []

Rétro No-Future

Un oeil sur la notice du CLD-D515

Voilà, mes 2 déménagements sont derrières mois, beaucoup de choses laissées aussi derrière moi mais certaine qui ont fait le chemin alors que je voudrais les laisser derrière moi, mais plus par leur forme que leur contenu.

Du coup, j’ai du me pencher sur des technologies mourantes, voire agonisantes pour répondre à ces questions. Commençons par une qui a brillé au firmament…

VHS

Ah, la bonne vieille bande magnétique, écrite sous différents angles, mais qui a connu un succès monstre grâce à un coût raisonnable, une longue période de vie et donc de démocratisation et une certaine aisance à copier, malgré la Macrovision d’ailleurs.

Sauf que les derniers appareils de lecture ont quasiment désertés les rayons de nos vendeurs et que les hybrides avec un graveur DVD n’ont pas été légions, la période de recouvrement finalement assez faible alors que déjà, on dématérialise, on se demande si le Blu-ray ça ne serait pas mieux, etc

Et donc, trouver un copieur VHS sur DVD , c’est soit payé cher un objet dont on a un usage discutable à plus que court terme, les modèles les plus chics coutant la bagatelle de 400€ et l’entrée de gamme à 200€… quand on sait que pour moins cher on peut avoir un lecteur/enregistreur de DVD classique, ça rend la chose encore plus comique.

Bref, le marché de l’occasion est là pour ça et afin de consommer mon futur divorce avec mes K7, j’ai adopté un LG RC388 qui, surprise bonus, est dézonable pour lire les DVDs1.
Et donc si toi qui lis, tu me connais et tu as ce même espoir secret d’avoir une fine galette au lieu d’une grosse boite en plastique, n’hésite pas à venir m’en parler.

Laser Disc (LD)

Autre curiosité de la collection, un laser disc, oui, un seul, qui appartient à mon ange et là, nous arrivons au coeur de ce billet. Est-ce que qui que ce soit à un jour fantasmer sur un futur avec des LD ?
Je veux dire, ça n’est même pas dans un imaginaire quelconque, ça n’a jamais appartenu à la moindre vision du future, pas comme des robots, des lasers.

Prenons Fallout, ce rétro-futur post-apocalyptique, il correspond à un imaginaire mais, merde, le Laser disc ! quoi !
Pareil, les voitures volantes, les hologrammes, même Mickey Magazine a du avoir un encart 2 pages sur le sujet mais le LD, franchement ?

Donc voilà, ça n’a jamais été le futur mais il y a du contenu *sic* exclusif *re-sic* à ce support, à savoir des bonus de certains films depuis transférés sur DVD, sans ce contenu là ou encore des Totales Exclusivités. Et là, c’est le drame.

Re-marché-de-l-occasion, pour découvrir avec horreur que la mécanique de ces Tupolevs de salon vieillit globalement mal à cause du poids de l’objet, à savoir que c’est un CD de la taille d’un 33T… et si vous ne savez pas ce qu’est un 33T, punition, allez voir la vidéo suivante.
Pire, l’objet en question était inscrit sur les deux faces et que donc la fonction auto-reverse était une option et que, pour les œuvres de plus de 2 heures, il fallait un deuxième support. Wikipedia m’a même raconté qu’il existait un léviathan de salon à double tiroirs auto-reverse pour les passionnés.

Donc depuis Noël, j’ai adopté un Tupolec, il est gentil, bruyant et affectueux.

Au fait, quel jour sommes-nous ?

Bref, avec ce retour arrière partiellement temporaire, je me suis mise à réfléchir sur notre quotidien et, comme dit plus haut avec le LD, nous ne sommes le futur de personne. Tout au plus un présent amélioré.

Car finalement, un Blu-ray, ça ressemble à un DVD, qui lui même ressemble à un CD, qui lui même, aussi, ressemble à un plateau de disque dur.
Que nos voitures, à part un pare-brise plus larges, n’ont rien de révolutionnaire.
Que notre apocalypse actuelle est super lente, on pollue mais la Terre est restée viable par rapport aux scénarios catastrophes. Pareil, il reste même du pétrole, pire on trouve de nouvelles saloperies source d’énergies avec les rendements améliorés de l’extraction du gaz de schiste.

Réellement, notre époque n’était dans aucun grand imaginaire, aucun écrivain de science-fiction ou de scénarios de jeux de rôles n’aurait pu concevoir un espace-temps aussi chiant.
Même le prion n’a pas été foutu de déclencher une apocalypse zombie… qu’est ce qu’on se fait chier !

  1. Cointreau sur la cerise serais-je tentée de dire vu que ça ne me servira à rien []

F(b)ucking Privacy

Facebook Instant Devilization

Bon, le buzz Facebook francophone du moment, c’est “l’instant personalization”, en gros, l’autorisation d’un partenaire de Facebook a plongé dans vos données personnelles, si vous avez une session Facebook, pour vous offrir une navigation aux petits oignons. C’est à peine plus invasif qu’un Google Mail mais ça, bizarrement, ça n’émeut personne.

Mais ce qui devrait buzzer, à mon avis, c’est le futur, futur annoncé depuis belle lurette d’ailleurs de la promotion sociale de nos goûts vers nos amis, pour faire de tout à chacun le trend-setter de son voisin.
En réalité, ce sera un monde magique où tout le monde spammera joyeusement, un monde tellement plus boooôôôôôhhhhh1.
Voir : http://www.zdnet.com/blog/feeds/is-facebook-sponsored-stories-turning-its-users-into-spammers/3535

Mais, il y a aussi du nouveau sur le menu ! Devenir le leader, comprendre s’offrir le monopole, des commentaires sur le Web. Actuellement, de plus en plus de blogs offrent des fonctionnalités d’interfaçage avec Facebook pour l’import/export des commentaires ou l’authentification.
La prochaine étape sera de ne pas juste étendre les fonctionnalités mais bien d’offrir une alternative intégrale. Dans le lien qui suit, il est même fait état d’un site qui ne prends que des commentaires via l’existence d’un compte Facebook. Le problème me direz-vous ? Et bien soit tu as un compte Facebook soit tu te tais sur la blogosphère et bien sûr, si tu as oublié d’avoir un pseudonyme, adieu vie privée.
Voir : http://news.cnet.com/8301-13577_3-20030106-36.html?tag=mantle_skin%3Bcontent

J’exagère bien sûr, ou plutôt, j’anticipe un peu, dans un monde dit libéral et qui offre de si magique situation de monopole à observer, du moins pour un certain web occidental.

  1. ou pourquoi mes goûts musicaux ou filmiques sont vides depuis fort longtemps []