일부 Linux 쉘 스크립트가 exec를 사용하여 명령을 실행하는 이유는 무엇입니까? [복사]

일부 Linux 쉘 스크립트가 exec를 사용하여 명령을 실행하는 이유는 무엇입니까? [복사]

예를 들어 Linux bash 스크립트에서는 다음과 같습니다.

exec /usr/lib/4.5/mono-service.exe ./AudioVideoRecorder.exe "$@"

, 해당 부분 없이 실행하는 exec대신 해당 명령을 사용해야 하는 이유는 무엇입니까 ?exec

답변1

짧은 대답은 다음과 같습니다.꼭 그럴 필요는 없지만 대략적인 비용이 절약됩니다.1밀리초CPU 시간(최신 CPU의 경우) ( 그 이후에는 아무것도 실행되지 않으므로 exec스크립트 끝에만 있어야 합니다.)exec

더 긴 대답은 다음과 같습니다. Exec현재 프로세스의 프로세스 이미지를 실행 중인 실행 파일의 프로세스 이미지로 바꿉니다. 이는 실행 시 execing 을 실행하는 쉘 프로세스가 완전히 파괴되고 ed 프로그램으로 대체됨을 의미합니다 exec. 이것이 완료되지 않으면 exec쉘은 자체적으로 분기하고, 분기에서 실행하고, 하위 프로세스가 종료될 때까지 기다리고, 반환 상태를 수집하고, 나중에 다른 명령을 실행하기를 희망합니다( fork+ exec는 새 명령이 생성되는 표준 절차입니다). . 없기 때문에 그것은 fork완전한 시간 낭비이고 그냥 하고 시간을 절약하는 것이 더 낫습니다 fork.

대부분의 의도와 목적에 있어서 이는 본질적으로 Unices에서 프로세스가 생성되는 방식에 대한 지식을 기반으로 한 미세 최적화입니다.


노트:(감사해요 이르카초) 약간 다른 의미는 스크립트를 생성한 프로세스가 잠재적으로 실행 중인 프로그램이 종료되는 방식에 관심이 있는지 여부입니다. 잠재적으로 실행 중인 하위 프로세스가 정상적으로 종료되는 경우 쉘 스크립트가 마지막으로 기다린 종료 상태를 자체 종료 상태로 전달하므로 실행 및 비실행 형식은 동일합니다. 그러나 자식 프로세스가 signal로 인해 종료되면 n쉘은 이를 종료 상태로 변환하여 128+n신호를 보낸 정보를 효과적으로 잃게 됩니다. ( >128일반적으로 그렇듯이 하위 항목이 정기적으로 종료 코드를 사용하여 종료되지 않을 것이라고 확신하는 경우 정보가 손실되지 않습니다 .) exec를 수행하면 더 이상 중개자 쉘이 없으며 종료 상태 정보는 실행 스크립트의 호출자에게 직접 전송됩니다(그리고 중개자 쉘이 없기 때문에 하위 프로세스가 종료되었는지 또는 신호를 받았는지에 대한 정보가 유지됩니다) 종료 코드에 병합합니다). (바라보다프로세스를 기다리는 중(2)더 많은 정보를 알고 싶다면).

관련 정보