728x90
1.init
- init과 연결된 수많은 프로세스들이 자신만의 프로세스 ID(PID)를 가지고 생성되기 시작
- init의 PID는 1
- init 프로세스가 시스템을 초기화하고 터미널 라인을 오픈하기 위한 작업을 시작하고, 표준 입력과 표준 출력, 표준 에러를 설정
- ps -ef 를 입력하면 PID와 같이 출력
- 표준 입력 (0): 키보드로부터 입력받는 것
- 표준 출력 (1) / 표준 에러(2) : 모니터로 출력하는 것
- 파일 디스크립터 0 1 2 ( 식별자 )
- 사용 사례 : bash 스크립트를 작성할 경우 표준 에러를 표준 출력으로 돌리고, 에러인 경우 dev/null로 찍는 경우 등등
- standard error redirection
- https://unix.stackexchange.com/questions/111611/what-does-the-rc-stand-for-in-etc-rc-d
- 그 이후 로그인 프롬포트를 보여줌
- init 프로세스는 /etc/rc.d/init.d 에 런레벨 별로 설정되어 있는 쉘 스크립트를 실행. 이 스크립트들은 chkconfig 명령을 사용해 부팅 시 자동으로 실행할지, 실행하지 않을지 설정
- 부팅 시 수행할 런레벨은 /etc/inittab에 설정되어 있음 (우분투 : /etc/init/rc-sysinit.conf!)
- 런레벨은 0부터 6까지 존재, 주로 텍스트 모드 런레벨인 3번(주로 서버)과 그래픽 모드 런레벨인 5번을 주로 사용(주로 데스크탑) 현재는 level 2를 사용
- rc1.d, rc2.d, rc3.d, rc4.d, rc5.d, rc6.d에 설정 파일이 들어가있음 (runlevel configuration)
- K로 시작하는 것은 kill, S로 시작하는 것은 Start를 의미하며 파일의 prefix를 수정하면 바로 반영
2. 로그인 프롬프트
- /bin/login 프로그램이 /etc/passwd 파일에 있는 첫 번째 필드를 체크하기 위해 유저 아이디를 검증하고, 존재하면 패스워드 검증
- 패스워드가 맞다면 /etc/passwd 파일의 마지막에 설정되어있는 SHELL 변수에는 로그인 쉘을, USER와 USERNAME 변수에는 로그인 이름을 할당
- 로그인이 끝나면 /etc/passwd 파일에서 유저 라인의 마지막 단계에 입력되어 있는 프로그램을 실행. 일반적으로 배시 쉘로 설정되어 있음
- 쉘 초기화 파일들
- /etc/profile
- 시스템 전역 쉘 변수 초기화
- 유저가 쉘에 로그인하면 가장 먼저 이 곳의 파일을 읽음. 이 파일에는 PATH, USER, LOGNAME, MAIL, HOSTNAME, HISTSIZE, INPUTRC 등의 쉘 변수들이 선언되어 있음
- 전역 리드라인 초기화 파일인 /etc/inputrc 파일을 읽어들이도록 되어 있으며, 프로그램들의 전역 환경을 설정하는 파일을 포함하고 있는 /etc/profile.d 디렉터리를 읽어들이도록 구성되어 있음
- /etc/bashrc
- 쉘 함수와 Alias를 위한 시스템 전역 변수 정의
- ~/.bash_profile
- 유저 개인의 환경 설정 파일
- 시스템 전역이 아닌 유저 자신만의 PATH와 시작 프로그램을 추가적으로 설정
- ~/.bashrc
- 유저 개인의 Alias 및 변수 설정 파일
- 유저 자신의 개인적 명령어 앨리아스를 정의할 수 있으며, /etc/bashrc 파일에서 시스템 전역 변수를 읽은 다음, 특별한 프로그램을 위한 변수를 설정할 수 있음
- ~/.bash_logout
- 로그아웃 설정 파일
- 로그아웃 절차를 포함하고 있음. ex) 로그아웃하면 터미널 윈도우가 사라짐
- source 명령
- 쉘 환경 설정 파일 즉시 적용하기. . 명령도 같은 기능을 수행
- zsh의 경우 ~/.zshrc 에 설정 파일이 존재!
- /etc/profile
- 명령 라인 파싱
- 히스토리 치환
- 명령라인은 토큰 또는 단어 단위
- 히스토리 업데이트
- 인용 진행
- 앨리아스 치환 / 함수 정의
- 리다이렉션, 백그라운드, 파이프 설정
- 변수 치환이 수행
- 명령 치환이 수행
- globbing 이라는 파일명 치환이 수행
- 명령이 실행
- 명령어 타입
- alias
- 키워드
- 함수
- 빌트인 내장명령
- 실행 파일
3. 프로세스와 쉘
- 프로세스 : 유일한 PID 번호에 의해 식별될 수 있는 실행 프로그램
- 실행 프로그램의 데이터와 스택, 프로그램 포인터와 스택 포인터 그리고 프로그램을 실행하기 위해 필요한 모든 정보들로 구성
- 쉘 : 로그인 프로세스를 완료했을 때, 시작하는 특별한 프로그램으로 프로세스임
- 커널 : 프로세스를 제어하고 관리
3.1 시스템 콜
- 쉘 스크립트로부터 명령을 실행했을 때, 빌트인 내부 코드 / 디스크 저장장치에서 명령을 찾고 실행된 명령을 정렬
- 커널 영역의 기능을 사용자 모드가 사용 가능하게,
즉 프로세스가 하드웨어에 직접 접근해서 필요한 기능을 사용할 수 있게 해줌 - fork 시스템 콜 : 콜프로세스의 복사본을 생성
- 자식 프로세스는 fork가 호출된 다음 실행하고 두 프로세스는 CPU 공유. 자식 프로세스는 부모 프로세스의 환경, 오픈된 파일, 실제적 유저 ID, umask, 현재 작업 디렉터리, 시그널의 복사본을 가짐
- 명령을 실행했을 때 아래와 같은 Flow를 가짐
- 쉘은 명령 라인을 파싱하고 첫 단어가 빌트인 명령인지, 디스크에 존재하는 실행 명령인지 판단
- 빌트인 명령 -> 곧바로 처리
- 디스크에 존재 -> 부모 쉘의 복사본을 만들기 위해 fork 시스템 콜 호출
- 자식 프로세스는 명령을 찾기 위해 PATH에 정의되어 있는 경로 검색하고 리다이렉션, 파이프, 명령 치환, 백그라운드 프로세싱을 위한 파일 디스크립터를 설정
- 자식 프로세스가 동작하는 동안 부모 프로세스는 잠시 멈춤
- wait 시스템 콜 : 자식 프로 세스 하나가 종료될 때까지 부모 프로세스를 대기상태로 유지
- wait가 성공하면 자식 프로세스가 종료되고, 종료상태를 가지고 있는 자식 프로세스의 PID를 리턴
- 자식 프로세스가 종료되기 전 부모 프로세스가 종료된다면, init 프로세스는 자식 프로세스를 고아가 된 좀비 프로세스로 만듬
- 부모를 대기상태로 만드는 것 + 프로세스가 정상적으로 종료하도록 보증하는 역할
- exec 시스템 콜 : 터미널에 명령을 수행한 다음, 쉘은 새로운 쉘 프로세스를 fork. 자식 쉘은 타이핑된 명령을 수행
- 쉘은 프로그램을 위해 PATH를 검색 -> 프로그램이 발견되면 명령의 이름과 함께 exec 시스템 콜을 호출
- 커널은 이 프로그램을 메모리에 로드하며 자식 쉘은 새 프로그램으로 오버랩
- 새 프로그램은 자식 프로세스가 되고 실행을 시작(모든 환경 변수, 오픈 파일, 유저 정보를 물려받음)
- exit 시스템 콜 : 중지
- 자식 프로세스를 종료할 때 자식 프로세스는 sigchild 시그널을 보내고 자식의 종료상태를 부모 프로세스가 받아들이도록 대기
- 종료상태는 0~255의 숫자이며 0은 성공적으로 실행되었단 뜻
- 0이 아닌 종료상태는 프로그램 실행 실패했다는 뜻
- 프로세스 종료하기
- CTRL-C 또는 CTRL-\\ 키를 이용해 종료할 수 있으며, kill 명령을 사용해 종료할 수 있음.
728x90
'IT_Engineer > DevOps_Unix & Linux (Bash)' 카테고리의 다른 글
[OS] CentOS 7 부팅 USB 만들기 (1) | 2020.12.02 |
---|---|
[Linux] 리눅스의 부팅 과정과 로그인 쉘 #2 (0) | 2020.11.20 |
[Linux] 쉘과 명령어 기초 #4 (0) | 2020.11.18 |
[Linux] 쉘과 명령어 기초 #3 (0) | 2020.11.17 |
[Linux] 쉘과 명령어 기초 #2 (0) | 2020.11.16 |