{"id":166,"date":"2020-02-10T21:28:19","date_gmt":"2020-02-10T20:28:19","guid":{"rendered":"https:\/\/www.grutt.org\/?p=166"},"modified":"2020-03-31T22:04:00","modified_gmt":"2020-03-31T20:04:00","slug":"superviser-une-application-linux-dans-sci-ga-gax","status":"publish","type":"post","link":"https:\/\/www.grutt.org\/?p=166","title":{"rendered":"Superviser une application Linux dans SCI\/GA\/GAX"},"content":{"rendered":"\n<p><strong>Mise \u00e0 jour du 31\/03\/2020 : <\/strong><br><em>Pardonnez moi cher lecteurs car j&rsquo;ai p\u00each\u00e9. En effet, et contrairement \u00e0 mes habitudes, j&rsquo;ai \u00e9crit cet article en me basant sur mes notes et sur mes souvenirs, ce qui fait que certaines parties \u00e9taient trop rapides ou absentes. D&rsquo;o\u00f9 cette mise \u00e0 jour. D\u00e9cid\u00e9ment, Cassandra est bien compliqu\u00e9 \u00e0 comprendre \ud83d\ude09<\/em><\/p>\n\n\n\n<p>Sur les applications les plus r\u00e9centes de Genesys, on note de plus en plus l&rsquo;utilisation de solutions \u00ab\u00a0libres\u00a0\u00bb. Je veux parler par exemple d&rsquo;applications telles que les bases de donn\u00e9es Cassandra, les serveurs web Apache ou Tomcat, Kafka,&#8230; Probl\u00e8me, ces solutions, telles qu&rsquo;elles, ne sont pas int\u00e9gr\u00e9es aux outils de supervision de Genesys que sont SCI, GA ou GAX. Or si elles plantent, votre solution sera tout aussi inutilisable que si c&rsquo;\u00e9tait un composant Genesys qui se vautrait&#8230; Nous allons donc rem\u00e9dier \u00e0 cela, en prenant pour exemple cette bonne vieille Cassandra !<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1007\" src=\"https:\/\/www.grutt.org\/wp-content\/uploads\/2020\/02\/1024px-Aias_Kassandra_Louvre_G458.jpg\" alt=\"\" class=\"wp-image-167\" srcset=\"https:\/\/www.grutt.org\/wp-content\/uploads\/2020\/02\/1024px-Aias_Kassandra_Louvre_G458.jpg 1024w, https:\/\/www.grutt.org\/wp-content\/uploads\/2020\/02\/1024px-Aias_Kassandra_Louvre_G458-300x295.jpg 300w, https:\/\/www.grutt.org\/wp-content\/uploads\/2020\/02\/1024px-Aias_Kassandra_Louvre_G458-768x755.jpg 768w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><figcaption>Oui faire du NoSQL, \u00e7a peut rendre ronchon !<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Le mod\u00e8le, c&rsquo;est important<\/h2>\n\n\n\n<p>Tout d&rsquo;abord, il faut savoir que Genesys propose de cr\u00e9er des mod\u00e8les d&rsquo;application pour ces serveurs tierces parties, <em>alias<\/em> comme le disent nos amis d&rsquo;outre manche \u00ab\u00a0<em>Third Party Server<\/em>\u00ab\u00a0.<br>Rien de sp\u00e9cial dans la cr\u00e9ation de ce template, je vais donc me limiter \u00e0 une capture d&rsquo;\u00e9cran.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1004\" height=\"324\" src=\"https:\/\/www.grutt.org\/wp-content\/uploads\/2020\/02\/Template.png\" alt=\"\" class=\"wp-image-168\" srcset=\"https:\/\/www.grutt.org\/wp-content\/uploads\/2020\/02\/Template.png 1004w, https:\/\/www.grutt.org\/wp-content\/uploads\/2020\/02\/Template-300x97.png 300w, https:\/\/www.grutt.org\/wp-content\/uploads\/2020\/02\/Template-768x248.png 768w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><figcaption>Oui, je d\u00e9borde d&rsquo;imagination pour mes noms de templates&#8230;<\/figcaption><\/figure>\n\n\n\n<p>Maintenant que le template est cr\u00e9\u00e9, nous pouvons attaquer la cr\u00e9ation de l&rsquo;application elle-m\u00eame. Bien s\u00fbr celle-ci sera bas\u00e9e sur ce nouveau template \u00ab\u00a0Cassandra Node\u00a0\u00bb.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">C&rsquo;est toujours up ?<\/h2>\n\n\n\n<p>Pour v\u00e9rifier que notre composant est toujours bien en m\u00e9moire, nous allons devoir nous assurer que le LCA de la machine h\u00f4te retrouve bien dans les process ce composant qui nous int\u00e9resse. Ici plusieurs \u00e9coles existent sous Linux, voici la mienne :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>R\u00e9pertoire de travail : \u00ab\u00a0\/\u00a0\u00bb (oui, simplement \/)<\/li><li>Ligne de commande : \u00ab\u00a0bin\/sh\u00a0\u00bb (\u00e0 adapter bien s\u00fbr si vous utilisez un autre shell). Celui-ci sera donc combin\u00e9 avec notre r\u00e9pertoire de travail pour faire un bon vieux \u00ab\u00a0\/bin\/sh\u00a0\u00bb<\/li><li>Arguments de ligne de commande : ici on arrive dans la partie int\u00e9ressante o\u00f9 on va sp\u00e9cifier le chemin vers nos ex\u00e9cutables. Cela d\u00e9pendra forc\u00e9ment de votre installation mais vous devriez arriver \u00e0 quelque chose du genre : \u00ab\u00a0\/LE_REPERTOIRE_D_INSTALLATION_DE_MON_CASSANDRA\/bin\/cassandra -f\u00a0\u00bb<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"515\" height=\"425\" src=\"https:\/\/www.grutt.org\/wp-content\/uploads\/2020\/02\/app.png\" alt=\"\" class=\"wp-image-172\" srcset=\"https:\/\/www.grutt.org\/wp-content\/uploads\/2020\/02\/app.png 515w, https:\/\/www.grutt.org\/wp-content\/uploads\/2020\/02\/app-300x248.png 300w\" sizes=\"auto, (max-width: 515px) 85vw, 515px\" \/><\/figure>\n\n\n\n<p>Avec ces options, vous devriez&#8230; pas pouvoir faire grand chose ! En effet, quand vous lancez cassandra en ligne de commande avec cette commande, il s&rsquo;agit en fait d&rsquo;un script qui s&rsquo;ex\u00e9cute et qui va lancer la ligne de commande java \u00ab\u00a0qui va bien\u00a0\u00bb avant de dispara\u00eetre tout en lui redonnant son PID. Nous allons donc modifier le script \u00ab\u00a0cassandra\u00a0\u00bb de lancement afin qu&rsquo;il ne disparaisse pas.<br>Pour cela, \u00e9ditez ce script et remplacez dedans :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># The cassandra-foreground option will tell CassandraDaemon not\n# to close stdout\/stderr, but it's up to us not to background.\nif &#91; \"x$foreground\" != \"x\" ]; then\n    cassandra_parms=\"$cassandra_parms -Dcassandra-foreground=yes\"\n    if &#91; \"x$JVM_ON_OUT_OF_MEMORY_ERROR_OPT\" != \"x\" ]; then\n        exec $NUMACTL \"$JAVA\" $JVM_OPTS \"$JVM_ON_OUT_OF_MEMORY_ERROR_OPT\" $cassandra_parms -cp \"$CLASSPATH\" $props \"$class\"\n    else\n        exec $NUMACTL \"$JAVA\" $JVM_OPTS $cassandra_parms -cp \"$CLASSPATH\" $props \"$class\"\n    fi\n# Startup CassandraDaemon, background it, and write the pid.\nelse\n    if &#91; \"x$JVM_ON_OUT_OF_MEMORY_ERROR_OPT\" != \"x\" ]; then\n        exec $NUMACTL \"$JAVA\" $JVM_OPTS \"$JVM_ON_OUT_OF_MEMORY_ERROR_OPT\" $cassandra_parms -cp \"$CLASSPATH\" $props \"$class\" &lt;&amp;- &amp;\n        &#91; ! -z \"$pidpath\" ] &amp;&amp; printf \"%d\" $! > \"$pidpath\"\n        true\n    else\n        exec $NUMACTL \"$JAVA\" $JVM_OPTS $cassandra_parms -cp \"$CLASSPATH\" $props \"$class\" &lt;&amp;- &amp;\n        &#91; ! -z \"$pidpath\" ] &amp;&amp; printf \"%d\" $! > \"$pidpath\"\n        true\n    fi\n    true\nfi<\/code><\/pre>\n\n\n\n<p>par :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># The cassandra-foreground option will tell CassandraDaemon not\n# to close stdout\/stderr, but it's up to us not to background.\nif &#91; \"x$foreground\" != \"x\" ]; then\n    cassandra_parms=\"$cassandra_parms -Dcassandra-foreground=yes\"\n    $NUMACTL \"$JAVA\" $JVM_OPTS $cassandra_parms -cp \"$CLASSPATH\" $props \"$class\"\n# Startup CassandraDaemon, background it, and write the pid.\nelse\n    $NUMACTL \"$JAVA\" $JVM_OPTS $cassandra_parms -cp \"$CLASSPATH\" $props \"$class\" &lt;&amp;- &amp;\n    &#91; ! -z \"$pidpath\" ] &amp;&amp; printf \"%d\" $! > \"$pidpath\"\n    true\nfi<\/code><\/pre>\n\n\n\n<p>(Oui c&rsquo;est barbare et je n&rsquo;y comprends pas grand chose. Merci \u00e0 mon coll\u00e8gue Antoine qui m&rsquo;a fil\u00e9 cette astuce, un barbu par l&rsquo;esprit, m\u00eame sans la pilosit\u00e9).<br>L&rsquo;id\u00e9e g\u00e9n\u00e9rale est la suppression des commandes \u00ab\u00a0exec\u00a0\u00bb qui vont permettre de ne plus faire dispara\u00eetre le script cassandra apr\u00e8s qu&rsquo;il ait lanc\u00e9 cassandra m\u00eame.<\/p>\n\n\n\n<p>Pour confirmer le bon fonctionnement de cette manipulation, allez faire un tour en ligne de commande sur votre h\u00f4te et faites un bon vieux \u00ab\u00a0ps -aux | grep cassandra\u00a0\u00bb (avec Cassandra actif).<br>Ainsi vous devriez retrouver la ligne de commande que cherche LCA (en plus de la ligne commen\u00e7ant par \u00ab\u00a0java\u00a0\u00bb), et qui doit correspondre \u00e0 la concat\u00e9nation de \u00ab\u00a0R\u00e9pertoire de travail\u00a0\u00bb + \u00ab\u00a0Ligne de commande\u00a0\u00bb + \u00ab\u00a0Arguments de ligne de commande\u00a0\u00bb. Si ce n&rsquo;est pas le cas, faites les ajustements n\u00e9cessaires.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Dans le doute, reboot !<\/h2>\n\n\n\n<p>Bon, maintenant on peut voir si l&rsquo;\u00e9tat de notre application, et \u00e7a c&rsquo;est bien. Mais pas moyen de l&rsquo;allumer\/\u00e9teindre <em>via<\/em> notre interface !<br>Rien de plus simple :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Un tour dans l&rsquo;onglet \u00ab\u00a0Options\u00a0\u00bb de l&rsquo;application (et non dans \u00ab\u00a0Options de l&rsquo;application\u00a0\u00bb). OK en anglais c&rsquo;est plus simple avec \u00ab\u00a0Annex\u00a0\u00bb et non \u00ab\u00a0Options\u00a0\u00bb&#8230;<\/li><li>Cr\u00e9ation d&rsquo;une section nomm\u00e9e \u00ab\u00a0start_stop\u00a0\u00bb<\/li><li>Cr\u00e9ation des options start_command et stop_command Celles-ci devront correspondre aux commandes vous permettant de lancer et arr\u00eater votre application<\/li><\/ul>\n\n\n\n<p>Sous Red Hat\/CentOS 7, j&rsquo;essaye de cr\u00e9er syst\u00e9matiquement un service pour g\u00e9rer le process Cassandra. Ainsi ces fameuses options ont pour valeur \u00ab\u00a0systemctl start cassandra\u00a0\u00bb et \u00ab\u00a0systemctl stop cassandra\u00a0\u00bb.<br>Attention, en fonction de l&rsquo;utilisateur qui fait tourner votre process LCA, il sera peut-\u00eatre n\u00e9cessaire d&rsquo;ajouter \u00ab\u00a0sudo\u00a0\u00bb avant, et de rajouter ce fameux utilisateur \u00e0 la liste des sudoers (voir \/etc\/sudoers).<br>Et vu que je suis dans un jour de bont\u00e9, un exemple de fichier .service servant de d\u00e9finition :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>[Unit]\nDescription=Cassandra\nAfter=network.target\n\n[Service]\nUser=genesys\nGroup=genesys\nType=simple\nWorkingDirectory=\/LE_REPERTOIRE_D_INSTALLATION_DE_MON_CASSANDRA\/bin\nExecStart=\/LE_REPERTOIRE_D_INSTALLATION_DE_MON_CASSANDRA\/bin\/cassandra -f \n\n[Install]\nWantedBy=multi-user.target\n<\/code><\/pre>\n\n\n\n<p>Avec tout ceci, vous devriez donc d\u00e9sormais pouvoir voir l&rsquo;\u00e9tat de vos base de donn\u00e9es Cassandra, contr\u00f4ler leur arr\u00eat\/d\u00e9marrage et m\u00eame les ajouter \u00e0 des solutions. Elle est pas belle la vie ?<br>Et pour rappel, cette m\u00e9thode g\u00e9n\u00e9rale est applicable \u00e0 d&rsquo;autres process Linux \ud83d\ude42<br><br>PS : dans la mythologie, Cassandra a toujours raison, mais personne ne la comprend. En l&rsquo;appliquant \u00e0 ma propre relation avec cette base de donn\u00e9es, je trouve le nom tr\u00e8s bien choisi \ud83d\ude00<\/p>\n\n\n\n<p><strong>Bonus CentOS6 :<\/strong><br>Et oui forc\u00e9ment, une fois qu&rsquo;on a une m\u00e9thode pour un OS, il faut le faire sur un autre&#8230; Bref. Me voici sur une CentOS6 et pas de service \u00e0 l&rsquo;horizon.<br>Du coup, j&rsquo;ai remplac\u00e9 la valeur de start_command par :<br>&#8211; \u00ab\u00a0\/LE_REPERTOIRE_D_INSTALLATION_DE_MON_CASSANDRA\/bin\/cassandra -f \u00ab\u00a0<br>et celle de stop_command par :<br>&#8211; \u00ab\u00a0\/LE_REPERTOIRE_D_INSTALLATION_DE_MON_CASSANDRA\/bin\/stop_cassandra\u00a0\u00bb<br>Votre esprit affut\u00e9 remarque que \u00ab\u00a0stop_cassandra\u00a0\u00bb n&rsquo;existe pas par d\u00e9faut. C&rsquo;est un mini script que j&rsquo;ai plac\u00e9 \u00e0 cet endroit et dont le contenu est le suivant :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>user=`whoami`\npgrep -u $user -f cassandra-pidfile | xargs kill<\/code><\/pre>\n\n\n\n<p>ATTENTION : celui-ci va par contre couper <strong>TOUS<\/strong> les Cassandra tournant actuellement sur votre host et avec le user utilis\u00e9 par LCA. Moche si vous avez des noeuds co-localis\u00e9s&#8230;<br>Si vous avez une solution, la zone commentaire sera ravie de l&rsquo;accueillir \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mise \u00e0 jour du 31\/03\/2020 : Pardonnez moi cher lecteurs car j&rsquo;ai p\u00each\u00e9. En effet, et contrairement \u00e0 mes habitudes, j&rsquo;ai \u00e9crit cet article en me basant sur mes notes et sur mes souvenirs, ce qui fait que certaines parties \u00e9taient trop rapides ou absentes. D&rsquo;o\u00f9 cette mise \u00e0 jour. D\u00e9cid\u00e9ment, Cassandra est bien compliqu\u00e9 &hellip; <a href=\"https:\/\/www.grutt.org\/?p=166\" class=\"more-link\">Continuer la lecture<span class=\"screen-reader-text\"> de &laquo;&nbsp;Superviser une application Linux dans SCI\/GA\/GAX&nbsp;&raquo;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11,12,14,7,5,6,8],"tags":[],"class_list":["post-166","post","type-post","status-publish","format-standard","hentry","category-base-de-donnees","category-cassandra","category-gax","category-genesys","category-linux","category-trucs-astuces","category-tutos"],"_links":{"self":[{"href":"https:\/\/www.grutt.org\/index.php?rest_route=\/wp\/v2\/posts\/166","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.grutt.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.grutt.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.grutt.org\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.grutt.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=166"}],"version-history":[{"count":5,"href":"https:\/\/www.grutt.org\/index.php?rest_route=\/wp\/v2\/posts\/166\/revisions"}],"predecessor-version":[{"id":179,"href":"https:\/\/www.grutt.org\/index.php?rest_route=\/wp\/v2\/posts\/166\/revisions\/179"}],"wp:attachment":[{"href":"https:\/\/www.grutt.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=166"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.grutt.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=166"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.grutt.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=166"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}