래퍼 스크립트에서 exec가 필요한 이유

래퍼 스크립트에서 exec가 필요한 이유

간단히 말해서 다음과 같은 래퍼 스크립트 예제를 보았습니다.

#!/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 인스턴스의 하위 프로세스로 시작됩니다.

첫 번째 접근 방식의 이점은 무엇입니까?

답변1

사용하면 exec래퍼가 더 투명해집니다. 즉, 스크립트를 호출하는 사용자나 응용 프로그램이 "실제" 프로그램을 실행하는 릴레이라는 사실을 알 필요가 줄어듭니다.

특히 호출자가 프로그램을 종료하려는 경우 방금 시작한 프로세스만 종료합니다. 래퍼 스크립트가 하위 프로세스를 실행하는 경우 호출자는 래퍼의 하위 프로세스를 찾아서 종료해야 한다는 것을 알아야 합니다. 래퍼 스크립트는 특정 신호를 전달하기 위해 트랩을 설정할 수 있지만 포착할 수 없는 SIGSTOP 또는 SIGKILL에서는 작동하지 않습니다.

이 호출은 exec또한 추가 셸을 유지할 필요가 없고 할 일이 없기 때문에 일부 메모리(및 PID와 같은 기타 리소스)를 절약합니다.

래퍼가 여러 개인 경우 문제가 증가합니다(종료할 올바른 프로세스를 찾는 어려움, 메모리 오버헤드 등).

일부 쉘(예: Korn 쉘)은 명령이 마지막이고 활성 트랩이 없는 시기를 자동으로 감지하고 암시적 을 배치 exec하지만 모든 쉘이 이를 수행하는 것은 아닙니다(예: bash 아님).

답변2

중복된 항목이 없습니다...참조FreeBSD 매뉴얼, 이는 충분한 이유를 제공합니다.

이것exec명령문은 쉘 프로세스를 지정된 프로그램으로 대체합니다. 만약에exec생략하면 프로그램이 실행되는 동안 쉘 프로세스가 메모리에 남아 있습니다.쓸데없이 소모됨시스템 리소스.

이것이 본질적으로 오래 전에 (포터에 의해) 나에게 설명되었고 잘 알려진 이유입니다.

관련 정보