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, exec
prawie 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 $myprog
uruchamiana jako proces potomny instancji bash.
Jakie są zalety pierwszego podejścia?
exec
wbudowanej powłoki .Odpowiedzi:
Użycie
exec
powoduje, ż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
exec
pozwala 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).źródło
Nie znaleziono duplikatów ... zapoznaj się z podręcznikiem FreeBSD , który podaje wystarczająco dobry powód:
co jest w zasadzie powodem wyjaśnionym mi dawno temu (przez jednego z tragarzy) i jest dość dobrze znane.
źródło