Po co używać `bash -c` w superwizorze zamiast bezpośredniego wywoływania skryptu?

11

Zaczynam używać supervisorddo kontrolowania usług na moim serwerze. Nie jestem profesjonalnym użytkownikiem Linuksa, ale mogę sobie z nim poradzić całkiem dobrze i uruchomić.

Z ciekawości zauważyłem, że większość poleceń w superwizji wydaje się nazywać:

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

Przeczytałem man basha i wiem, że -cnależy go użyć do wstawienia zmiennych przekazywanych po ciągu.

Jaki jest sens używania bash -cw superwizorze (lub w innym miejscu) zamiast bezpośredniego wywoływania skryptu (jak w przykładzie poniżej), biorąc pod uwagę, że żadne zmienne nie zostały przekazane / użyte?

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

Dzięki!

Daniel Costa
źródło

Odpowiedzi:

11

Powłoki takie funkcje jak rozszerzenie ścieżce, ( *, ?), listy polecenie ( ;, &&, ||), przekierowania ( <, >, |,,) nie są realizowane przez supervisord że tylko dzieli polecenia w tablicy łańcuchów argument.

bash -cMoże być tylko pomoc dla początkującego użytkownika, który może być skłonny do korzystania z tych funkcji w poleceniu. Na przykład unika to zaskoczenia

command=echo foo > /tmp/bar

wypisuje foo > /tmp/barzamiast pisać foodo /tmp/bar.

-cma niewiele wspólnego ze zmiennymi. Wszelkie dodatkowe argumenty do bash będzie dostępna tylko jako argumenty skryptu $0, $1itp w poleceniu, ale to cecha rzadko ma żadnego pożytku. Na przykład bash -c 'echo $0 $0' foowyjścia foo foo.

Marko Kohtala
źródło
1
Dzięki, to była bardzo pragmatyczna odpowiedź i to prawdopodobnie zaoszczędzi mi dużo czasu. Ja, jako początkujący użytkownik, popełniłbym ten błąd (i nigdy nie uważam go bash -cza rozwiązanie!).
Daniel Costa
6

Jest to wyjaśnione w dokumentacji :

Po uruchomieniu podprocesu żadna powłoka nie jest wykonywana przez superwizor, więc zmienne środowiskowe, takie jak USER, PATH, HOME, SHELL, LOGNAME itp. Nie są zmieniane z wartości domyślnych ani w inny sposób przypisywane. Jest to szczególnie ważne, aby pamiętać, gdy program jest uruchamiany z poziomu administratora i jest uruchamiany jako root z konfiguracją user = zwrotka.

Aby obejść ten problem, bash -cmożna użyć.

Mark Wagner
źródło
2
Mark, dziękuję za twoją odpowiedź, ale myślę, że drugi był bardziej prawdopodobnym scenariuszem (chociaż twój nie jest dla mnie niepoprawny, nadal muszę wybrać jedną właściwą odpowiedź ..). Oprócz tego pomagam nowemu użytkownikowi z mniejszą liczbą punktów.
Daniel Costa