{"id":265,"date":"2017-04-24T23:19:00","date_gmt":"2017-04-24T23:19:00","guid":{"rendered":"http:\/\/hoper.dnsalias.net\/atdc\/index.php\/2017\/04\/24\/20170424creation-d-un-service-simple-avec-systemd\/"},"modified":"2019-09-20T10:46:51","modified_gmt":"2019-09-20T08:46:51","slug":"20170424creation-d-un-service-simple-avec-systemd","status":"publish","type":"post","link":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/2017\/04\/24\/20170424creation-d-un-service-simple-avec-systemd\/","title":{"rendered":"Cr\u00e9er un service avec systemd"},"content":{"rendered":"<h3>Le besoin<\/h3>\n<p>Historiquement, faire en sorte qu&rsquo;un script personnel se lance au d\u00e9marrage n&rsquo;\u00e9tait pas tr\u00e8s compliqu\u00e9. Dans l&rsquo;ancien system V, il suffisait de jouer avec les scripts (et les liens) dans \/etc\/init.d et \/etc\/rcX.d, et on arrivait facilement \u00e0 avoir quelque chose qui se lan\u00e7ait proprement avec des commandes du style \u00ab\u00a0service mon_service start\u00a0\u00bb et \u00ab\u00a0service mon_service stop\u00a0\u00bb. Si le bon lien \u00e9tait cr\u00e9\u00e9 dans \/etc\/rc2.d par exemple (S99mon_service), alors il se lan\u00e7ait aussi automatiquement au boot. Simple.<\/p>\n<p>Malheureusement (heureusement ?) Systemd est venu modifier tout \u00e7a. Je ne rentrerai pas dans le d\u00e9tail de tout ce que systemd apporte par rapport \u00e0 system V (parall\u00e9lisation, gestion des d\u00e9pendances, supervision des services etc). Disons simplement qu&rsquo;il est beaucoup, beaucoup plus \u00e9volu\u00e9 que l&rsquo;ancien syst\u00e8me. Ce qui explique qu&rsquo;il a \u00e9t\u00e9 choisi par la grande majorit\u00e9 des distributions linux les plus connus. Pour avoir un bon aper\u00e7u des fonctionnalit\u00e9s de systemd, je vous renvoie \u00e0 <a href=\"http:\/\/linuxfr.org\/news\/systemd-l-init-martyrise-l-init-bafoue-mais-l-init-libere\">cet article<\/a> de linuxfr. Mais qui dit \u00ab\u00a0plus \u00e9volu\u00e9\u00a0\u00bb dit aussi un peu plus compliqu\u00e9 \u00e0 utiliser. Quelle est donc la proc\u00e9dure \u00e0 suivre pour faire exactement la m\u00eame chose qu&rsquo;avant ? Cr\u00e9er un service simple, qui se contente de lancer le script shell de notre choix lors du boot de la machine ?<\/p>\n<h3>La solution<\/h3>\n<p>Avant tout, il conviendra de se familiariser un peu avec les commandes de systemd. Pour cela (et aussi pour apprendre \u00e0 cr\u00e9er son propre service&#8230;) je recommande vivement la lecture de <a href=\"http:\/\/lea-linux.org\/documentations\/Systemd\">cette page<\/a>. En r\u00e9sum\u00e9, la commande \u00e0 utiliser est \u00ab\u00a0systemctl\u00a0\u00bb. puis l&rsquo;argument (status, start, stop, enable, disable&#8230;). Enfin le nom du service. (pour status, le fait de l&rsquo;utiliser sans services permet d&rsquo;avoir la liste de tous les services avec leur hi\u00e9rarchie).<\/p>\n<p>Pour cr\u00e9er notre propre service, il faut cr\u00e9er un fichier texte dans \/etc\/systemd\/system\/. Ce fichier texte va d\u00e9crire le service, ses d\u00e9pendances, ce qui se passe en cas d\u2019\u00e9chec etc. Ensuite il faudra activer ce nouveau service. Et comme je suis trop gentil, je vous ai fait un <a href=\"https:\/\/hoper.dnsalias.net\/tdc\/public\/make_service.sh\">mini script<\/a> qui fait tout \u00e7a automatiquement. (Lisez le, on ne peut rien faire de plus basique que \u00e7a). Voila ce que son ex\u00e9cution affiche sans argument:<\/p>\n<blockquote><p>root@gemeaux:\/tmp# .\/make_service.sh<br \/>\nCe script fabrique un \u00ab\u00a0service\u00a0\u00bb qui lance un script shell sous systemd Il n\u00e9cessite obligatoirement 4 arguments qui sont:<br \/>\n&#8211; Le nom du service<br \/>\n&#8211; Le chemin complet du script \u00e0 lancer<br \/>\n&#8211; Le nom des services qui doivent d\u00e9j\u00e0 avoir \u00e9t\u00e9 lanc\u00e9s<br \/>\n&#8211; yes ou no: yes si \u00e0 la fin du script on consid\u00e8re que le service est toujours actif no dans le cas contraire (utile si le script en question est cens\u00e9 tourner tout le temps)<\/p>\n<p>&nbsp;<\/p><\/blockquote>\n<p>Exemples :<\/p>\n<pre>.\/make_service.sh 'monservice' '\/rep\/script.sh' '' yes\r\n.\/make_service.sh 'monservice' '\/home\/rep\/script.sh'\r\n'apache2.service postfix.service' yes<\/pre>\n<p>Dans le second cas, notre service ne sera lanc\u00e9 qu&rsquo;apr\u00e8s apache et postfix.<\/p>\n<h3>Les pi\u00e8ges \u00e0 \u00e9viter<\/h3>\n<p>Le script \u00e0 lancer doit absolument signaler son interpr\u00e9teur de commande, et donc commencer par: #!\/bin\/bash. ll doit aussi avoir les droits en ex\u00e9cution. Enfin, et m\u00eame si c&rsquo;est \u00e9vident, il faut avoir les droits root pour lancer le script.<\/p>\n<h3>Suppression du service<\/h3>\n<p>Rien de plus simple. Il suffira de le d\u00e9sactiver (systemctl disable nom_du_service) puis de supprimer le fichier texte qui le d\u00e9crit:<\/p>\n<pre>rm \/etc\/systemd\/system\/monservice.service<\/pre>\n<p>Amusez vous bien !<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Le besoin Historiquement, faire en sorte qu&rsquo;un script personnel se lance au d\u00e9marrage n&rsquo;\u00e9tait pas tr\u00e8s compliqu\u00e9. Dans l&rsquo;ancien system V, il suffisait de jouer avec les scripts (et les liens) dans \/etc\/init.d et \/etc\/rcX.d, et on arrivait facilement \u00e0 avoir quelque chose qui se lan\u00e7ait proprement avec des commandes du style \u00ab\u00a0service mon_service start\u00a0\u00bb [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-265","post","type-post","status-publish","format-standard","hentry","category-geekitude"],"_links":{"self":[{"href":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/wp-json\/wp\/v2\/posts\/265","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/wp-json\/wp\/v2\/comments?post=265"}],"version-history":[{"count":7,"href":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/wp-json\/wp\/v2\/posts\/265\/revisions"}],"predecessor-version":[{"id":1603,"href":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/wp-json\/wp\/v2\/posts\/265\/revisions\/1603"}],"wp:attachment":[{"href":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/wp-json\/wp\/v2\/media?parent=265"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/wp-json\/wp\/v2\/categories?post=265"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hoper.dnsalias.net\/atdc\/index.php\/wp-json\/wp\/v2\/tags?post=265"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}