Warum "bash -c" im Supervisor verwenden, anstatt das Skript direkt aufzurufen?

11

Ich fange an supervisord, Dienste auf meinem Server zu steuern. Ich bin kein Profi-Benutzer von Linux, kann aber ganz gut damit umgehen und es zum Laufen bringen.

Aus Neugier habe ich festgestellt, dass die meisten Befehle in Supervisord wie folgt heißen:

[program:install]
command=bash -c "/src/etc/install.sh"

Ich habe bashs Mann gelesen und weiß, dass -cdamit Variablen eingefügt werden sollten, die nach der Zeichenfolge übergeben werden.

Was bringt es also, bash -cin Supervisor (oder an einem anderen Ort) zu verwenden, anstatt das Skript direkt aufzurufen (wie im folgenden Beispiel), wenn man bedenkt, dass keine Variablen übergeben / verwendet wurden?

[program:install]
command=/src/etc/install.sh

Vielen Dank!

Daniel Costa
quelle

Antworten:

11

Shell - Funktionen wie Pfadnamenerweiterung ( *, ?), Befehlslisten ( ;, &&, ||), Umleitung ( <, >, |,) nicht durch supervisord umgesetzt , dass nur den Befehl in ein Array von Argumente strings aufspaltet.

Dies ist bash -cmöglicherweise nur eine Hilfe für Anfänger, die möglicherweise versucht sind, solche Funktionen im Befehl zu verwenden. Zum Beispiel vermeidet es die Überraschung, dass

command=echo foo > /tmp/bar

Ausgänge foo > /tmp/baranstelle des Schreibens foozu /tmp/bar.

-chat wenig mit Variablen zu tun. Jede zusätzliche Argumente an die bash würde nur als Skriptargumente zur Verfügung $0, $1etc. in dem Befehl, aber das Feature hat selten eine Verwendung. Zum Beispiel bash -c 'echo $0 $0' fooAusgänge foo foo.

Marko Kohtala
quelle
1
Danke, das war eine sehr pragmatische Antwort, und das wird mir wahrscheinlich viel Zeit sparen. Ich als Anfänger würde diesen Fehler machen (und niemals über bash -ceine Lösung nachdenken !).
Daniel Costa
6

Es wird in der Dokumentation erklärt :

Keine Supervision wird von Supervisord ausgeführt, wenn ein Unterprozess ausgeführt wird. Daher werden Umgebungsvariablen wie USER, PATH, HOME, SHELL, LOGNAME usw. nicht von ihren Standardeinstellungen geändert oder auf andere Weise neu zugewiesen. Dies ist besonders wichtig, wenn Sie ein Programm von einem Supervisor ausführen, der als root mit einer Zeilengruppe user = in der Konfiguration ausgeführt wird.

Um dieses Problem bash -czu umgehen, kann es verwendet werden.

Mark Wagner
quelle
2
Mark, danke für deine Antwort, aber ich denke, das andere war ein plausibleres Szenario (obwohl deins für mich nicht falsch ist, muss ich immer noch eine richtige Antwort auswählen.). Außerdem helfe ich dem neuen Benutzer mit weniger Punkten.
Daniel Costa