프로세스·fork·exec·종료 상태
Process · 프로세스 · fork · exec
는 실행 중인 프로그램의 주소 공간·스레드·파일 참조·자격 정보를 묶는 운영체제의 실행 단위이다. 파일에 저장된 프로그램과 달리 PID와 실행 상태를 가지며 생성·프로그램 교체·종료·회수 단계를 거친다.
밑줄 용어에 마우스를 올리거나, 키보드로 선택하거나, 터치하면 설명을 볼 수 있습니다.
01무엇이고, 어떤 일을 하나
- 코드 실행에 필요한 메모리와 열린 파일 등의 상태를 보유한다.
- 부모·자식 관계로 작업을 시작하고 종료 결과를 전달한다.
- 시그널과 스케줄링을 통해 중지·재개·종료와 CPU 사용을 조정한다.
02어떤 순서로 동작하나
- 자식 생성
는 부모 실행 상태를 바탕으로 자식 를 만들며 부모와 자식에서 반환값이 다르다.
- 프로그램 교체
자식이 계열 호출에 성공하면 PID를 유지하면서 실행할 프로그램 이미지가 바뀐다.
- 실행과 종료
프로그램은 정상 반환·exit 또는 시그널 등으로 종료하며 종료 원인과 상태가 기록된다.
- 부모의 회수
부모가 계열 호출로 자식의 종료 상태를 얻는다. 종료했으나 회수되지 않은 자식은 상태로 남을 수 있다.
03먼저 알아둘 용어와 구성요소
- 는 실행 중인 프로그램의 주소 공간, 자격 정보, 열린 파일, 실행 상태 등을 묶은 커널 관리 단위다.
- 전형적인 셸 실행에서는 계열로 자식을 만들고 자식이 계열로 새 프로그램 이미지를 적재한다.
- 는 성공하면 같은 PID에서 프로그램을 교체하므로 새 PID를 하나 더 만드는 호출과 다르다.
- 부모는 계열로 자식의 종료 상태를 회수할 수 있다.
- R은 실행 가능, S는 인터럽트 가능한 대기, D는 보통 I/O 관련 비인터럽트 대기, Z는 실행을 끝냈지만 종료 상태가 회수되지 않은 좀비다. 가 CPU를 계속 계산하는 상태라는 해석은 틀리다.
- 은 정상 정리 기회를 주는 종료 요청이고 SIGKILL은 프로그램의 정리 핸들러로 처리할 수 없는 강제 종료다.
SSH 서비스의 active와 enabled를 서로 다른 상태로 읽기
서비스를 지금 시작하는 작업과 부팅 시 시작 경로를 등록하는 작업을 실제 status 출력으로 구별한다.
실습 구성과 전제
- 의 ssh.service 화면을 사용한다. 배포판에 따라 같은 서버 프로그램의 unit 이름이 sshd.service일 수 있다.
- 첫 화면과 enable 이후 화면은 Main PID와 시작 시각을 대조해 읽는다. socket activation 표시도 함께 살핀다.
현재 실행 상태를 읽는다
- start는 현재 서비스의 시작을 요청한다. status의 Active가 active (running)이면 해당 unit의 실행 상태를 뜻하며, 부팅 때 자동 시작하도록 등록되었다는 뜻은 아니다.
- ExecStartPre의 sshd 검사 성공과 Main PID를 보면 사전 검사와 실제 서버 를 분리할 수 있다. TriggeredBy의 ssh.socket은 별도 소켓 unit과의 관계다.
bashsystemctl status ssh.service --no-pager systemctl is-active ssh.service systemctl is-enabled ssh.service예시다. 각 조회 명령의 출력과 종료 상태는 서로 다른 질문에 답한다.
원본 크기로 보기 ↗- Loaded 줄에는 disabled가 보이지만 Active 줄은 active (running)이다.
- ExecStartPre의 종료 상태는 성공이고 Main PID가 표시되며, ssh.socket의 트리거 관계도 나타난다.
확인 기준active와 disabled는 모순이 아니다. 실행 여부와 unit 파일의 활성화 상태를 별도 열로 기록한다.
enable이 만든 시작 경로를 확인한다
- enable은 unit의 설치 지시를 바탕으로 target의 wants 같은 연결을 만든다. 기본 enable만으로 현재 를 새로 실행하거나 재시작하지 않는다.
- 화면에서는 enable 후 생성 메시지가 나오고 Loaded가 enabled로 바뀐다. 이미 실행 중인 서버의 Main PID가 이어지는 것이 이 차이를 보여 준다.
원본 크기로 보기 ↗- enable 출력에 multi-user.target.wants/ssh.service 등의 연결 생성 메시지가 보인다.
- Loaded는 enabled로 바뀌었고 Active는 여전히 running이며 기존 Main PID가 유지된다.
확인 기준enable --now는 활성화 등록과 현재 시작을 함께 요청하는 옵션이다. enable만 실행한 사례와 구분한다.
서비스·소켓·부팅 경로를 함께 대조한다
- is-enabled만으로 서버가 현재 수신 가능한지 판단하지 않는다. 서비스 실패, 소켓 unit의 활성화, 실제 리슨 포트를 각각 확인한다.
- 소켓 활성화를 사용하는 배포판에서는 ssh.socket이 연결을 받아 서비스를 시작할 수 있다. unit 파일과 현재 소켓 상태를 확인한 뒤 해당 환경의 시작 경로를 설명한다.
bashsystemctl status ssh.socket --no-pager systemctl cat ssh.service ssh.socket ss -lnt설치된 unit 구성과 리슨 소켓을 읽기 전용으로 대조한다.
확인 기준서비스가 active인데 접속되지 않으면 포트·주소·방화벽을 확인한다. 서비스가 inactive여도 소켓 활성화가 설정되었는지 먼저 살핀다.
실습에서 확인한 동작 원리
- active는 현재 실행 상태이고 enabled는 시작 의존 관계를 등록한 상태다.
- 설정 파일, unit 활성화, , 리슨 소켓은 서로 연결되지만 같은 증거는 아니다.
동작·명령 참고 문서
04예제로 따라가기
- 같은 실행 파일을 두 번 실행하면 서로 다른 PID와 실행 상태를 가진 두 가 생길 수 있다.
- 뒤 공유된 열린 파일 설명을 사용하는 두 fd는 읽기 오프셋을 공유하지만 두 번 별도 open한 참조는 일반적으로 오프셋이 독립적이다.
- 서비스의 exit 1과 실행 파일을 시작하지 못한 의 203/는 실패가 발생한 경계가 다르다.
05혼동하기 쉬운 점과 확인 기준
- 실행 파일이 없거나 실행할 수 없으면 서비스 프로그램의 업무 코드에 들어가기 전에 실패한다. journal의 실행 경로와 시스템 오류를 앱 로그 부재와 함께 해석한다.
- 프로그램이 실행된 뒤 오류로 끝나면 종료 코드·시그널과 같은 시각의 앱 로그가 근거다. ExecMainStatus를 포트 번호나 재시작 횟수로 읽지 않는다.
- start-limit-hit은 반복 시작이 제한됐다는 후속 상태다. 최초 실패의 실행 경로·권한·의존 연결 오류를 찾아야 제한 해제 후 같은 루프가 반복되지 않는다.
06상세 노트 · 실습 자료
헤더 구조, 설정 예시, 수치 계산과 수업 캡처는 아래 노트에서 이어집니다.
공식 문서 · 표준
기초 개념과 동작 설명을 대조한 자료입니다. 제품 버전과 실제 설정에 따른 차이는 본문 및 원문에서 확인하세요.