랩퍼 스크립트의 exec 이유


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 인스턴스가 시작된 다음 bash 인스턴스 $myprog의 하위 프로세스로 시작됩니다.

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



또한 ( 사이트에서!) : exec내장 의 유스 케이스 / 실제 예제 .
Scott

답변:


31

exec래퍼를 사용 하면 래퍼가 더 투명 해집니다. 즉, 스크립트를 호출하는 사용자 나 응용 프로그램이 "실제"프로그램을 시작하는 릴레이임을 인식 할 필요가 없습니다.

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

exec또한 호출 하면 별도의 셸을 남겨 둘 필요가 없으므로 약간의 메모리 (및 PID 등의 기타 리소스)가 절약됩니다.

랩퍼가 여러 개인 경우 문제점이 발생합니다 (적절한 프로세스를 찾는 데 어려움, 메모리 오버 헤드 등).

일부 쉘 (예 : Korn 쉘)은 명령이 마지막 명령 일 때 자동으로 감지하고 활성 트랩이없고 암시 적이 exec지만 모든 것을 포함하지는 않습니다 (예 : bash는 아님).


10

복제물 찾기 ... FreeBSD 핸드북을 참조하십시오 . 충분한 이유가 있습니다.

exec문은 지정된 프로그램으로 쉘 프로세스를 대체합니다. 경우 exec생략 쉘 프로세스는 프로그램이 실행되는 동안 메모리에 유지하고 불필요하게 소비 시스템 자원.

이것은 본질적으로 나에게 꽤 오랫동안 되돌아온 이유이며 (포터 중 한 사람에 의해), 꽤 잘 알려져 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.