개념 사전 · 개념

프로세스·fork·exec·종료 상태

Process · 프로세스 · fork · exec

는 실행 중인 프로그램의 주소 공간·스레드·파일 참조·자격 정보를 묶는 운영체제의 실행 단위이다. 파일에 저장된 프로그램과 달리 PID와 실행 상태를 가지며 생성·프로그램 교체·종료·회수 단계를 거친다.

밑줄 용어에 마우스를 올리거나, 키보드로 선택하거나, 터치하면 설명을 볼 수 있습니다.

01무엇이고, 어떤 일을 하나

  • 코드 실행에 필요한 메모리와 열린 파일 등의 상태를 보유한다.
  • 부모·자식 관계로 작업을 시작하고 종료 결과를 전달한다.
  • 시그널과 스케줄링을 통해 중지·재개·종료와 CPU 사용을 조정한다.

02어떤 순서로 동작하나

  1. 자식 생성

    는 부모 실행 상태를 바탕으로 자식 를 만들며 부모와 자식에서 반환값이 다르다.

  2. 프로그램 교체

    자식이 계열 호출에 성공하면 PID를 유지하면서 실행할 프로그램 이미지가 바뀐다.

  3. 실행과 종료

    프로그램은 정상 반환·exit 또는 시그널 등으로 종료하며 종료 원인과 상태가 기록된다.

  4. 부모의 회수

    부모가 계열 호출로 자식의 종료 상태를 얻는다. 종료했으나 회수되지 않은 자식은 상태로 남을 수 있다.

03먼저 알아둘 용어와 구성요소

는 실행 중인 프로그램의 주소 공간, 자격 정보, 열린 파일, 실행 상태 등을 묶은 커널 관리 단위다.
전형적인 셸 실행에서는 계열로 자식을 만들고 자식이 계열로 새 프로그램 이미지를 적재한다.
는 성공하면 같은 PID에서 프로그램을 교체하므로 새 PID를 하나 더 만드는 호출과 다르다.
부모는 계열로 자식의 종료 상태를 회수할 수 있다.
R은 실행 가능, S는 인터럽트 가능한 대기, D는 보통 I/O 관련 비인터럽트 대기, Z는 실행을 끝냈지만 종료 상태가 회수되지 않은 좀비다. 가 CPU를 계속 계산하는 상태라는 해석은 틀리다.
은 정상 정리 기회를 주는 종료 요청이고 SIGKILL은 프로그램의 정리 핸들러로 처리할 수 없는 강제 종료다.
LEARN THROUGH PRACTICE

SSH 서비스의 active와 enabled를 서로 다른 상태로 읽기

서비스를 지금 시작하는 작업과 부팅 시 시작 경로를 등록하는 작업을 실제 status 출력으로 구별한다.

실습 구성과 전제

  • 의 ssh.service 화면을 사용한다. 배포판에 따라 같은 서버 프로그램의 unit 이름이 sshd.service일 수 있다.
  • 첫 화면과 enable 이후 화면은 Main PID와 시작 시각을 대조해 읽는다. socket activation 표시도 함께 살핀다.
  1. 현재 실행 상태를 읽는다

    • start는 현재 서비스의 시작을 요청한다. status의 Active가 active (running)이면 해당 unit의 실행 상태를 뜻하며, 부팅 때 자동 시작하도록 등록되었다는 뜻은 아니다.
    • ExecStartPre의 sshd 검사 성공과 Main PID를 보면 사전 검사와 실제 서버 를 분리할 수 있다. TriggeredBy의 ssh.socket은 별도 소켓 unit과의 관계다.
    bash
    systemctl status ssh.service --no-pager
    systemctl is-active ssh.service
    systemctl is-enabled ssh.service

    예시다. 각 조회 명령의 출력과 종료 상태는 서로 다른 질문에 답한다.

    4/22 · 명령·상태 출력 2원본 크기로 보기 ↗
    • Loaded 줄에는 disabled가 보이지만 Active 줄은 active (running)이다.
    • ExecStartPre의 종료 상태는 성공이고 Main PID가 표시되며, ssh.socket의 트리거 관계도 나타난다.
    확인 기준

    active와 disabled는 모순이 아니다. 실행 여부와 unit 파일의 활성화 상태를 별도 열로 기록한다.

  2. enable이 만든 시작 경로를 확인한다

    • enable은 unit의 설치 지시를 바탕으로 target의 wants 같은 연결을 만든다. 기본 enable만으로 현재 를 새로 실행하거나 재시작하지 않는다.
    • 화면에서는 enable 후 생성 메시지가 나오고 Loaded가 enabled로 바뀐다. 이미 실행 중인 서버의 Main PID가 이어지는 것이 이 차이를 보여 준다.
    4/22 · 명령·상태 출력 3원본 크기로 보기 ↗
    • enable 출력에 multi-user.target.wants/ssh.service 등의 연결 생성 메시지가 보인다.
    • Loaded는 enabled로 바뀌었고 Active는 여전히 running이며 기존 Main PID가 유지된다.
    확인 기준

    enable --now는 활성화 등록과 현재 시작을 함께 요청하는 옵션이다. enable만 실행한 사례와 구분한다.

  3. 서비스·소켓·부팅 경로를 함께 대조한다

    • is-enabled만으로 서버가 현재 수신 가능한지 판단하지 않는다. 서비스 실패, 소켓 unit의 활성화, 실제 리슨 포트를 각각 확인한다.
    • 소켓 활성화를 사용하는 배포판에서는 ssh.socket이 연결을 받아 서비스를 시작할 수 있다. unit 파일과 현재 소켓 상태를 확인한 뒤 해당 환경의 시작 경로를 설명한다.
    bash
    systemctl 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상세 노트 · 실습 자료

헤더 구조, 설정 예시, 수치 계산과 수업 캡처는 아래 노트에서 이어집니다.

공식 문서 · 표준

기초 개념과 동작 설명을 대조한 자료입니다. 제품 버전과 실제 설정에 따른 차이는 본문 및 원문에서 확인하세요.