나는 /usr/sbin/service
한 줄의 코드가 포함된 클래식 서비스 스크립트를 이해하려고 노력합니다.
exec env -i ...... ${SERVICE} .....
나는 exec
명령이 프로세스를 분기하지 않고 보존하며 프로세스 이미지를 명령으로 대체한다는 것을 알고 있습니다. 그런 다음 COMMAND를 사용하는 것처럼 현재 프로세스가 실행됩니다.
에 대한 env
? 위와 같을까요?
포크보다 현재 프로세스를 교체하는 것이 더 나은 이유는 무엇입니까?
답변1
이를 사용하는 이유는 env -i
나머지 명령을 실행하기 전에 환경 변수를 지우는 것입니다.
귀하의 질문에 실제로 대답하려면 Windows를 고려하십시오.
Windows에서는 새 프로그램을 시작하는 매우 합리적인 방법인 것처럼 보이는 "CreateProcess"를 제공합니다. 그러나 CreateProcess의 문제점은 새 프로세스에 대해 수십 가지 설정을 지정해야 할 수 있으며 각 설정마다 CreateProcess 함수 호출에 대한 또 다른 매개변수가 필요하다는 것입니다. 이는 부모가 자녀에 대해 가질 수 있는 통제의 양을 제한합니다.
Unix에서는 프로세스가 먼저 자체 복제(모든 프로세스 설정 상속)한 다음 두 번째 복사본이 설정을 변경하고 마지막으로 새 프로그램으로 대체할 수 있다는 아이디어를 내놓았습니다. 이를 통해 CreateProcess 등에 대한 인수로 각각을 추가하지 않고도 현재 디렉터리, 환경, 파일 핸들, 열린 소켓, 신호 마스크 등과 같은 항목을 변경하기 위해 임의/모든 시스템 호출을 사용할 수 있습니다.
그런 다음 다양한 시작 작업을 수행하는 프로그램을 "연결"하는 깔끔한 기능이 있습니다. 각 프로그램은 자신을 일부 변경한 후 다음 프로그램을 "실행"합니다. env
이 프로그램 중 하나입니다. 자체 환경을 수정한 다음 다른 프로그램을 실행합니다. 바라보다CHPST이는 시작하려는 프로그램에서 변경할 수 있는 모든 것에 대한 좋은 예입니다.