{"id":2649,"date":"2013-08-27T09:26:45","date_gmt":"2013-08-27T09:26:45","guid":{"rendered":"https:\/\/contabo.com\/blog\/?p=2649"},"modified":"2021-12-23T09:02:25","modified_gmt":"2021-12-23T08:02:25","slug":"prozesse-mit-supervisor-kontrollieren","status":"publish","type":"post","link":"https:\/\/contabo.com\/blog\/de\/prozesse-mit-supervisor-kontrollieren\/","title":{"rendered":"Prozesse mit Supervisor kontrollieren"},"content":{"rendered":"\n<p>Ein bestimmtes Programm ablaufen zu lassen ist h\u00e4ufig ein Grund um einen virtuellen oder dedizierten Server zu betreiben. Wenn das Programm als Teil der verwendeten Linux-Distribution verf\u00fcgbar ist, reicht das Installieren des Paketes und das Bearbeiten der Konfigurationsdateien \u00fcblicherweise aus. Falls das Programm aber aus einer externen Quelle kommt oder eine Eigenentwicklung ist, steht man selbst vor der Aufgabe daf\u00fcr zu sorgen, dass es beim Systemstart automatisch gestartet wird. Au\u00dferdem ist es in der Entwicklungsphase oft sinnvoll, das Programm automatisch neu starten zu lassen, falls es durch einen Fehler abbricht. Vor einigen Jahren war es relativ einfach, ein Programm bei Systemstart starten zu lassen. Es musste nur ein passendes init-Script erstellt werden. Seit einiger Zeit setzen einige Linux-Distribution f\u00fcr den Systemstart auf <code>upstart<\/code> oder <code>systemd<\/code> anstelle von <code>init<\/code>. Passende Konfiguration f\u00fcr alle Systeme bereitzustellen kann recht aufwendig werden. Zudem besitzen <code>upstart<\/code> und<code>systemd<\/code> zwar eine Option zum automatischen Neustart eines Programms, die gleiche Funktionalit\u00e4t in <code>init<\/code> zu benutzen erfordert aber das Ver\u00e4ndern der Konfigurationsdatei des <code>initd<\/code>.<\/p>\n\n\n\n<p>F\u00fcr den Eigenbedarf nutze ich selbst seit einiger Zeit <code>supervisor<\/code> zur L\u00f6sung dieses Problems. Auf <a href=\"http:\/\/supervisord.org\" rel=\"nofollow\">http:\/\/supervisord.org<\/a> finden Sie sowohl das Programm selbst als auch die Dokumentation dazu. Bei den meisten Linux-Distributionen gibt es aber schon Pakete daf\u00fcr in den Repositories. Supervisor wird bei Systemstart von init oder einer der Alternativen automatisch gestartet. Um das eigene Programm damit zu betreiben muss es in der Konfiguration des supervisor bekannt gemacht werden.<\/p>\n\n\n\n<p>Sollten Sie sich nicht sicher sein, ob Ihr Benutzer \u00fcber die notwendigen Rechte verf\u00fcgt, k\u00f6nnen Sie zu Beginn einer jeden SSH-Session das folgende Kommando ausf\u00fchren:<\/p>\n\n\n\n<p><code>sudo -i<\/code><\/p>\n\n\n\n<p>Nach Ausf\u00fchrung des Kommandos erhalten Sie weiterf\u00fchrende (Root-) Berechtigungen ohne das Kommando &#8222;sudo&#8220; jedem Befehl auf der Kommandozeile voranstellen zu m\u00fcssen.<\/p>\n\n\n\n<p>Als Beispiel habe ich hier eine Webapplikation in Python geschrieben, erstellt mit dem bottle Framework (<a href=\"http:\/\/bottlepy.org\" rel=\"nofollow\">http:\/\/bottlepy.org<\/a>). Da dies kein Tutorial zur Webprogrammierung sein soll, ist das Programm sehr einfach.<\/p>\n\n\n\n<p><code>1 from bottle import route, run<br>\n2<br>\n3 @route('\/')<br>\n4 def index():<br>\n5&nbsp;&nbsp;&nbsp;&nbsp; return 'Hello World'<br>\n6<br>\n7 run(host='0.0.0.0', port=8080)<\/code><\/p>\n\n\n\n<p>Dieses Programm startet einen Webserver auf Port 8080 und zeigt &#8218;Hello World&#8216; an, wenn man mit einem Webbrowser darauf zugreift. Das Programm wird in der Datei <code>app.py<\/code> gespeichert und anschlie\u00dfen mit <code>python app.py<\/code> ausgef\u00fchrt. Es l\u00e4uft dann bis es manuell beendet wird oder abst\u00fcrzt. Dies ist ein guter Zeitpunkt um die Konfiguration von Supervisor durchzuf\u00fchren damit dieser unser Programm ausf\u00fchrt. Supervisor stellt ein Kommandozeilenprogramm bereit, mit dem der aktuelle Status abgerufen werden kann bzw. konfigurierte Programme gestartet oder gestoppt werden k\u00f6nnen. Der Aufruf von <code>supervisorctl status<\/code> zeigt uns&#8230; nichts, denn wir haben noch keine Einstellung vorgenommen. Wir legen eine Datei <code>hello.conf<\/code> an und speichern sie in <code>\/etc\/supervisor\/conf.d\/<\/code> ab. Diese enth\u00e4lt die n\u00f6tigen Parameter damit Supervisor unser Programm steuern kann. Die einfachste Konfiguration enth\u00e4lt einen Namen f\u00fcr unser Programm, das Kommando, das ausgef\u00fchrt werden soll und einen Benutzernamen unter dem das Programm ausgef\u00fchrt werden soll. Wird der Benutzername weggelassen, wird das Programm als root ausgef\u00fchrt &#8211; in den meisten F\u00e4llen ein unn\u00f6tiges Sicherheitsrisiko.<\/p>\n\n\n\n<p><code>[program:hello]<br>\ncommand=\/usr\/bin\/python \/home\/markus\/app.py<br>\nuser=markus<\/code><\/p>\n\n\n\n<p>Die Pfade sind hier bewusst absolut angegeben. Nachdem die Datei gespeichert wurde, k\u00f6nnen wir sie von supervisor einlesen lassen, in dem wir das Kommando <code>supervisorctl reread<\/code> ausf\u00fchren. Wenn alles richtig eingegeben ist, dann sollte uns die Ausgabe dieses Kommandos zeigen, dass jetzt ein neues Programm verf\u00fcgbar ist:<\/p>\n\n\n\n<p><code># supervisorctl reread<br>\nhello: available<\/code><\/p>\n\n\n\n<p>Dieses Programm k\u00f6nnen wir nun starten:<\/p>\n\n\n\n<p><code># supervisorctl start hello<br>\nhello: started<\/code><\/p>\n\n\n\n<p>Wir pr\u00fcfen nun nochmals den Status:<\/p>\n\n\n\n<p><code># supervisorctl status<br>\nhello&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RUNNING&nbsp;&nbsp;&nbsp; pid 32675, uptime 0:00:46<br>\n<\/code><\/p>\n\n\n\n<p>Wie man hier sehen kann, l\u00e4uft unser Programm. Es wird au\u00dferdem die PID und die Zeit seit dem Start angezeigt. Wir simulieren nun einen Absturz indem wir das Programm beenden und pr\u00fcfen ob Supervisor wie gewollt einen Neustart durchf\u00fchrt:<\/p>\n\n\n\n<p><code># kill -9 32675<br>\n# supervisorctl status<br>\nhello&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RUNNING&nbsp;&nbsp;&nbsp; pid 32686, uptime 0:00:04<br>\n<\/code><\/p>\n\n\n\n<p>Die supervisor Website enth\u00e4lt noch wesentlich mehr Information \u00fcber m\u00f6gliche Parameter f\u00fcr Programme oder die Konfiguration von supervisor selbst. Es ist z.B. auch m\u00f6glich, Protokolldateien f\u00fcr die Programme anzulegen und diese automatisch zu rotieren, wenn sie eine bestimmte Gr\u00f6\u00dfe \u00fcberschreiten. Weitere Details gibt es hier: <a href=\"http:\/\/supervisord.org\/configuration.html\" rel=\"nofollow\">http:\/\/supervisord.org\/configuration.html<\/a>. Endlich gibt es keinen Grund mehr, seine Applikationen in einer screen-Sitzung laufen zu lassen&#8230; \ud83d\ude09<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ein bestimmtes Programm ablaufen zu lassen ist h\u00e4ufig ein Grund um einen virtuellen oder dedizierten Server zu betreiben. Wenn das Programm als Teil der verwendeten Linux-Distribution verf\u00fcgbar ist, reicht das Installieren des Paketes und das Bearbeiten der Konfigurationsdateien \u00fcblicherweise aus. Falls das Programm aber aus einer externen Quelle kommt oder eine Eigenentwicklung ist, steht man [&hellip;]<\/p>\n","protected":false},"author":20,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1399],"tags":[1176,1437,1440,1441,1442],"ppma_author":[1503],"class_list":["post-2649","post","type-post","status-publish","format-standard","hentry","category-tutorials","tag-konfiguration","tag-server-de","tag-supervisor-de","tag-tutorial-de","tag-virtuelle-server-de"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"Markus","author_link":"https:\/\/contabo.com\/blog\/de\/author\/markush\/"},"uagb_comment_info":0,"uagb_excerpt":"Ein bestimmtes Programm ablaufen zu lassen ist h\u00e4ufig ein Grund um einen virtuellen oder dedizierten Server zu betreiben. Wenn das Programm als Teil der verwendeten Linux-Distribution verf\u00fcgbar ist, reicht das Installieren des Paketes und das Bearbeiten der Konfigurationsdateien \u00fcblicherweise aus. Falls das Programm aber aus einer externen Quelle kommt oder eine Eigenentwicklung ist, steht man&hellip;","authors":[{"term_id":1503,"user_id":20,"is_guest":0,"slug":"markush","display_name":"Markus","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/ec941657f54e47d08edadc14f82d2e9f72f02cc924e22920292a2889eaa89a41?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/posts\/2649","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/users\/20"}],"replies":[{"embeddable":true,"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/comments?post=2649"}],"version-history":[{"count":0,"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/posts\/2649\/revisions"}],"wp:attachment":[{"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/media?parent=2649"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/categories?post=2649"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/tags?post=2649"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/contabo.com\/blog\/de\/wp-json\/wp\/v2\/ppma_author?post=2649"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}