powód wykonania w skryptach otoki

27

Widziałem przykłady skryptu opakowania, które w skrócie są następujące:

#!/bin/bash

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

exec "$myprog" "$@"

Jak widać powyżej, execprawie natychmiast zastępują nowo utworzoną powłokę $myprog. Można to osiągnąć bez exec:

#!/bin/bash

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

"$myprog" "$@"

W tym ostatnim przykładzie uruchamiana jest nowa instancja bash, a następnie $myproguruchamiana jako proces potomny instancji bash.

Jakie są zalety pierwszego podejścia?

Jaskółka oknówka
źródło
Zobacz na przykład stackoverflow.com/questions/18351198/…
Thomas Dickey,

Odpowiedzi:

31

Użycie execpowoduje, że opakowanie jest bardziej przejrzyste, tzn. Zmniejsza prawdopodobieństwo, że użytkownik lub aplikacja wywołująca skrypt musi wiedzieć, że jest to przekaźnik, który z kolei uruchamia „prawdziwy” program.

W szczególności, jeśli dzwoniący chce zabić program, po prostu zabije proces, który właśnie uruchomił. Jeśli skrypt opakowania uruchamia proces potomny, osoba dzwoniąca musi wiedzieć, że powinna znaleźć dziecko opakowania i go zabić. Skrypt otoki może ustawić pułapkę na przekazywanie niektórych sygnałów, ale nie działałoby to z SIGSTOP lub SIGKILL, których nie można złapać.

Wywołanie execpozwala także zaoszczędzić trochę pamięci (i innych zasobów, takich jak PID itp.), Ponieważ nie trzeba utrzymywać dodatkowej powłoki i nie ma już nic do roboty.

Jeśli istnieje wiele opakowań, problemy sumują się (trudność w znalezieniu odpowiedniego procesu do zabicia, obciążenie pamięci itp.).

Niektóre pociski (np. Powłoka Korna) automatycznie wykrywają, kiedy polecenie jest ostatnim, i nie ma aktywnej pułapki i umieszcza domyślną exec, ale nie wszystkie (np. Nie bash).

Gilles „SO- przestań być zły”
źródło
10

Nie znaleziono duplikatów ... zapoznaj się z podręcznikiem FreeBSD , który podaje wystarczająco dobry powód:

execOświadczenie zastępuje powłoki proces z określonym programem. Jeśli execzostanie pominięty, proces powłoki pozostaje w pamięci podczas wykonywania programu i niepotrzebnie zużywa zasoby systemowe.

co jest w zasadzie powodem wyjaśnionym mi dawno temu (przez jednego z tragarzy) i jest dość dobrze znane.

Thomas Dickey
źródło