쉘에서 실행되는 UNIX명령어는 sub-shell이 생성되어 실행되는것이다.
여기서 sub-shell이란 fork-exec로 만들어지는 child process 쉘이다. 외부 명령어 실행은 기본적으로 sub shell을 생성하기 때문에 process 생성의 overhead가 존재한다.
fork-exec에서 child process는 return code인 exit code를 반환한다.
위의 예시에서는 ls -al 명령이 child process로 작동한다.
sub shell에게 일을 분담하는 것은 하나의 함수를 호출하는 행위와 비슷하다고 보면 된다. child process를 만들어서 exit code를 받고, 성공/실패에 따라서 분기하는 행위는 multi-process의 처리 방식이다.
fork 는 기본적으로 parent process의 자원을 복제하는데, exec가 곧바로 발생하면 새로운 프로세스 이미지를 로딩하면서 바로 이전에 fork에서 복제한 parent process의 old image 자원은 곧바로 해제된다. 따라서 fork-exec시에는 곧바로 해제할 쓸모없는 메모리 복제를 피하기 위해, fork시 메모리 복사를 pending 하는 CoW(Copy On Write, 수정하기전까지는 복제하는 작업을 최대한 미룬다!) 기법이 나오게 된 것이다.🙊
Parent process가 종료된 child process의 exit status를 처리하기 전의 상태이다.
exit code도 메타정보(시간정보, 권한정보 등등..)에 있다. 프로세스가 종료되면 데이터영역과 자원들이 해제가 되지만 즉시 메모리에서 제거되지 않는다. 즉 메타정보의 일부분이 남아있다. (매우 적은양의 메모리만 차지한다)
하지만 모든 프로세스의 종료는 zombie 상태를 거쳐서 해제되는게 정상적인 과정이다. 따라서 zombie process가 생긴다는 것은 zombie process의 parent process가 문제가 있는 것이다.
예를 들어, rm을 하려는데 대상 파일이 없는경우 프로세스가 작동하면서 temporary한 파일을 만들어낼수있다. 프로세스가 종료되면 이런 temporary한 파일들을 다 제거해야 한다. 이때 rm명령으로 파일갯수가 몇갠지도 모르겠고 쓰레기 파일이 없을수도 있는데 에러코드가 0 이나오거나 1이나올때 1이 나오면 프로세스를 어떻게 처리한다는 작업을 무시하기 위해 force 옵션을 사용한다. 즉 리턴값은 무시한다가 force 옵션이다.
쉘 변수에 상수 속성을 설정한다. (=fork하는 경우 child process에 상속된다.)
프로세스가 종료되면 shell 변수의 메모리 공간도 당연히 해제된다.
Invoking type은 bash가 실행되는 타입이다.
🤷♀️ "interactive와 non-interactive mode의 차이?"
interactive mode는 현재 쉘에서 실행하는것이고 non-interactive mode는 쉘 스크립트나 batch에서 실행하는 것이다.