Perché usare `bash -c` nel supervisore invece di chiamare direttamente lo script?


11

Sto iniziando a utilizzare supervisordper controllare i servizi nel mio server. Non sono un utente pro di Linux, ma riesco a farlo abbastanza bene e farlo funzionare.

Solo per curiosità, ho notato che la maggior parte dei comandi in supervisord sembrano essere chiamati come:

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

Ho letto l'uomo di bash e so che -cdovrebbe essere usato per inserire variabili passate dopo la stringa.

Quindi qual è lo scopo nell'uso bash -cin supervisore (o in qualsiasi altro luogo) invece di chiamare direttamente lo script (come nell'esempio seguente), considerando che nessuna variabile è stata passata / utilizzata?

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

Grazie!

Risposte:


11

Shell caratteristiche come l'espansione del percorso ( *, ?), comando elenca ( ;, &&, ||), il reindirizzamento ( <, >, |,) non sono implementati da supervisord che solo divide il comando in una matrice di stringhe argomento.

La bash -cpuò essere solo un aiuto per l'utente alle prime armi che potrebbero essere tentati di utilizzare tali caratteristiche nel comando. Ad esempio evita la sorpresa che

command=echo foo > /tmp/bar

output foo > /tmp/barinvece di scrivere foosu /tmp/bar.

-cha poco a che fare con le variabili. Eventuali ulteriori argomenti alla bash poteva essere disponibile soltanto come argomenti di script $0, $1ecc nel comando, ma questa caratteristica ha raramente qualsiasi uso. Ad esempio bash -c 'echo $0 $0' foouscite foo foo.


1
Grazie, è stata una risposta molto pragmatica e probabilmente mi farà risparmiare un sacco di tempo. Io, come utente inesperto, farei questo errore (e non penserei mai bash -ccome una soluzione!).
Daniel Costa,

6

È spiegato nella documentazione :

Nessuna shell viene eseguita da supervisord quando esegue un sottoprocesso, quindi le variabili di ambiente come USER, PATH, HOME, SHELL, LOGNAME, ecc. Non vengono modificate dalle impostazioni predefinite o altrimenti riassegnate. Ciò è particolarmente importante da notare quando si esegue un programma da un supervisord eseguito come root con user = stanza nella configurazione.

Per aggirare questo problema bash -cpuò essere utilizzato.


2
Mark, grazie per la tua risposta, ma penso che l'altro fosse uno scenario più plausibile (anche se il tuo non è sbagliato per me, devo ancora scegliere una risposta giusta ..). Oltre a ciò, sto anche aiutando il nuovo utente con meno punti.
Daniel Costa,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.