리눅스 강의 정리 Day 6 - bash

joy_hye5·2020년 12월 17일
0

sub shell

쉘에서 실행되는 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로 작동한다.

exit code

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, 수정하기전까지는 복제하는 작업을 최대한 미룬다!) 기법이 나오게 된 것이다.🙊

zombie process (defunct process)

Parent process가 종료된 child process의 exit status를 처리하기 전의 상태이다.
exit code도 메타정보(시간정보, 권한정보 등등..)에 있다. 프로세스가 종료되면 데이터영역과 자원들이 해제가 되지만 즉시 메모리에서 제거되지 않는다. 즉 메타정보의 일부분이 남아있다. (매우 적은양의 메모리만 차지한다)

하지만 모든 프로세스의 종료는 zombie 상태를 거쳐서 해제되는게 정상적인 과정이다. 따라서 zombie process가 생긴다는 것은 zombie process의 parent process가 문제가 있는 것이다.

exit code 예제

rm --force 옵션에 대한 오해

  • child process로 작동할때 exit code를 조작하기 위해 force 옵션을 사용한다. 즉, shell script 처리를 위해 존재하는 기능들이다.

예를 들어, rm을 하려는데 대상 파일이 없는경우 프로세스가 작동하면서 temporary한 파일을 만들어낼수있다. 프로세스가 종료되면 이런 temporary한 파일들을 다 제거해야 한다. 이때 rm명령으로 파일갯수가 몇갠지도 모르겠고 쓰레기 파일이 없을수도 있는데 에러코드가 0 이나오거나 1이나올때 1이 나오면 프로세스를 어떻게 처리한다는 작업을 무시하기 위해 force 옵션을 사용한다. 즉 리턴값은 무시한다가 force 옵션이다.


bash shell

shell variables

환경변수

쉘 변수에 상수 속성을 설정한다. (=fork하는 경우 child process에 상속된다.)

  • declare -x MY_ENV_VAR="hyewon"
  • export MY_ENV_VAR="hyewon"
    (위의 두가지 방식은 모두 동일한 명령이다)

variable : life-cycle

프로세스가 종료되면 shell 변수의 메모리 공간도 당연히 해제된다.

  • permancy를 제공하려면 rc(run command, runtime config)나 profile에 변수의 값을 저장시켜야 한다. bash가 실행될 때마다 매번 파일을 읽어들이도록 하는것이다.
  • .bashrc, .bash profile이 바로 그 역할을 한다.

Invoking type

invoking mode

Invoking type은 bash가 실행되는 타입이다.

  • Authentication 과정
  • Command-execution 방식
    위의 두가지 방식에 따라 분류된다. 하지만 interactive login shell, interactive non-login shell, non-interactive shell 이렇게 총 3가지의 실행 방식이 조합되어 사용된다.

🤷‍♀️ "interactive와 non-interactive mode의 차이?"
interactive mode는 현재 쉘에서 실행하는것이고 non-interactive mode는 쉘 스크립트나 batch에서 실행하는 것이다.


Scripting

scripting

  • #! 는 실행 쉘을 선언하는것으로 뒤에는 실행할 쉘의 절대경로를 적어준다. (#! /bin/bash)
  • bash 문법을 실행할 수 있도록 작성한뒤 파일 실행 권한을 주거나 bash 가 실행하면서 불러오도록 해야 한다.

script execution

  • sh 는 POSIX모드로 사용하기 때문에 제한된 기능밖엔 사용하지 못한다. 문제가 생길수도 있다.
  • .(source mode) 는 설정파일을 불러올때 실행하지 script를 실행할땐 쓰지 않는다. 또한 서브쉘을 생성하지 않는 방법이기때문에 bash 일부 기능의 작동을 보장하지 못하는 문제가 생길수도있다.
  • 3. ./scriptfile.sh : x권한이 있어야 실행이 가능하다.
  • 4. bash 는 실행권한이 없을때도 실행 할 수 있다

0개의 댓글