Grund für die Ausführung in Wrapper-Skripten

27

Ich habe Beispiele für Wrapper-Skripte gesehen, die kurz und bündig wie folgt lauten:

#!/bin/bash

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

exec "$myprog" "$@"

Wie oben zu sehen, execersetzen sie die neu erstellte Shell fast sofort durch die $myprog. Man könnte dasselbe erreichen, ohne exec:

#!/bin/bash

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

"$myprog" "$@"

In diesem letzten Beispiel wird eine neue Bash-Instanz gestartet und dann $myprogals untergeordneter Prozess der Bash-Instanz gestartet.

Was sind die Vorteile des ersten Ansatzes?

Martin
quelle
Siehe zum Beispiel stackoverflow.com/questions/18351198/…
Thomas Dickey

Antworten:

31

Durch execdie Verwendung von wird der Wrapper transparenter, dh es ist weniger wahrscheinlich, dass der Benutzer oder die Anwendung, die das Skript aufruft, sich darüber im Klaren ist, dass es sich um ein Relay handelt, das wiederum das „echte“ Programm startet.

Insbesondere, wenn der Aufrufer das Programm beenden möchte, wird der gerade gestartete Prozess abgebrochen. Wenn das Wrapper-Skript einen untergeordneten Prozess ausführt, muss der Aufrufer wissen, dass er das untergeordnete Element des Wrappers ermitteln und stattdessen beenden soll. Das Wrapper-Skript könnte einen Trap setzen, um einige Signale weiterzuleiten, aber das würde mit SIGSTOP oder SIGKILL nicht funktionieren, die nicht abgefangen werden können.

Das Aufrufen execspart außerdem ein wenig Speicher (und andere Ressourcen wie PIDs usw.), da keine zusätzliche Shell vorhanden sein muss, die nichts mehr zu tun hat.

Wenn mehrere Wrapper vorhanden sind, summieren sich die Probleme (Schwierigkeit, den richtigen Prozess zum Beenden zu finden, Speicheraufwand usw.).

Einige Shells (z. B. die Korn-Shell) erkennen automatisch, wann ein Befehl der letzte ist, und es gibt keine aktive Falle. Sie setzen ein implizites exec, aber nicht alle tun dies (z. B. kein Bash).

Gilles 'SO - hör auf böse zu sein'
quelle
10

Finding keine Duplikate ... beziehen sich auf die FreeBSD - Handbuch , das einen guten Grund genug gibt:

Die execAnweisung ersetzt den Shell-Prozess durch das angegebene Programm. Wenn dies execweggelassen wird, bleibt der Shell-Prozess während der Ausführung des Programms im Speicher und verbraucht unnötig Systemressourcen.

Das ist im Wesentlichen der Grund, der mir vor einiger Zeit (von einem der Träger) erklärt wurde und der ziemlich bekannt ist.

Thomas Dickey
quelle