причина для виконання у скриптах для обгортки


27

Я бачив приклади сценарію обгортки, які в двох словах наступні:

#!/bin/bash

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

exec "$myprog" "$@"

Як видно з вище, вони використовують execдля заміни новоствореної оболонки майже одразу на $myprog. Цього можна було досягти і без exec:

#!/bin/bash

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

"$myprog" "$@"

У цьому останньому прикладі запускається новий екземпляр bash, а потім $myprogзапускається як дочірній процес bash-екземпляра.

Які переваги першого підходу?


Дивіться, наприклад, stackoverflow.com/questions/18351198/…
Томас Дікі

Відповіді:


31

Використання execробить обгортку більш прозорою, тобто робить меншою ймовірність того, що користувач або додаток, що викликає сценарій, повинні знати, що це ретрансляція, яка по черзі запускає "справжню" програму.

Зокрема, якщо абонент хоче вбити програму, він просто вб’є процес, який вони тільки що запустили. Якщо скрипт обгортки запускає дочірній процес, абонент повинен знати, що він повинен знайти дитину обгортки і замість цього вбити. Сценарій обгортки може встановити пастку для ретрансляції деяких сигналів, але це не працюватиме з SIGSTOP або SIGKILL, які неможливо зловити.

Виклик execтакож економить трохи пам’яті (та інших ресурсів, таких як PID тощо), оскільки немає потреби тримати зайву оболонку навколо, нічого не залишається робити.

Якщо є декілька обгортків, проблеми виникають (труднощі у пошуку правильного процесу для вбивства, накладні пам'яті тощо).

Деякі оболонки (наприклад, оболонка Korn) автоматично визначають, коли команда є останньою, і немає активної пастки, і ставлять неявно exec, але не всі роблять (наприклад, не баш).


10

Не знайшовши дублікатів ..., зверніться до посібника FreeBSD , який дає достатньо вагомих причин:

Оператор execзамінює процес оболонки вказаною програмою. Якщо execпропущено, процес оболонки залишається в пам'яті під час виконання програми і непотрібно споживає системні ресурси.

що по суті є причиною, яку мені пояснили досить довго назад (одним із носіїв), і є досить відомим.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.