motivo per exec negli script wrapper


27

Ho visto esempi di script wrapper che in breve sono i seguenti:

#!/bin/bash

myprog=sleep
echo "This is the wrapper script, it will exec "$myprog""

exec "$myprog" "$@"

Come visto sopra, usano execper sostituire la shell appena creata quasi immediatamente con $myprog. Si potrebbe ottenere lo stesso senza exec:

#!/bin/bash

myprog=sleep
echo "This is the wrapper script, it will exec "$myprog""

"$myprog" "$@"

In quest'ultimo esempio, viene avviata una nuova istanza bash, quindi $myprogavviata come processo figlio dell'istanza bash.

Quali sono i vantaggi del primo approccio?



Risposte:


31

L'uso execrende il wrapper più trasparente, ovvero rende meno probabile che l'utente o l'applicazione che chiama lo script debbano essere consapevoli del fatto che è un relè che a sua volta avvia il programma "reale".

In particolare, se il chiamante vuole uccidere il programma, ucciderà semplicemente il processo che ha appena avviato. Se lo script wrapper esegue un processo figlio, il chiamante dovrebbe sapere che dovrebbe invece scoprire il figlio del wrapper e ucciderlo. Lo script wrapper potrebbe impostare una trappola per inoltrare alcuni segnali, ma ciò non funzionerebbe con SIGSTOP o SIGKILL che non possono essere catturati.

La chiamata execconsente inoltre di risparmiare un po 'di memoria (e altre risorse come PID, ecc.) Poiché non è necessario mantenere una shell in più senza che sia rimasto nulla da fare.

Se ci sono più wrapper, i problemi si sommano (difficoltà a trovare il giusto processo per uccidere, sovraccarico di memoria, ecc.).

Alcune shell (ad esempio la shell di Korn) rilevano automaticamente quando un comando è l'ultimo e non c'è una trap attiva e mettono implicitamente exec, ma non tutti lo fanno (ad esempio non bash).


10

Non trovare duplicati ... fai riferimento al manuale di FreeBSD , che fornisce una ragione sufficiente:

L' execistruzione sostituisce il processo shell con il programma specificato. Se execviene omesso, il processo di shell rimane in memoria durante l'esecuzione del programma e consuma inutilmente le risorse di sistema.

che è essenzialmente il motivo che mi è stato spiegato un po 'di tempo fa (da uno dei facchini), ed è abbastanza noto.

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.