리눅스 프로세스 대기

LinuxBeginner
지금 연습하기

소개

리눅스 프로세스는 프로그램을 실행하고 작업을 수행하는 운영 체제의 기본 구성 요소입니다. 쉘 스크립트를 개발할 때, 여러 프로세스를 동시에 실행하고 후속 작업을 진행하기 전에 해당 프로세스가 완료되도록 하는 경우가 많습니다.

이 랩에서는 리눅스 쉘 스크립팅의 wait 명령에 대해 배우게 됩니다. 이 강력한 도구를 사용하면 부모 프로세스가 백그라운드 자식 프로세스가 완료될 때까지 실행을 일시 중지할 수 있습니다. 프로세스 대기 기술을 마스터함으로써 여러 동시 작업을 적절하게 조정하는 보다 효율적인 스크립트를 만들 수 있습니다.

프로세스 대기에 대한 이해는 시스템 관리, 자동화 및 강력한 쉘 스크립트 개발에 필수적입니다. 백그라운드 프로세스를 시작하고, 완료를 기다리고, 종료 상태를 처리하여 안정적인 실행 흐름을 보장하는 방법을 배우게 됩니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 92%입니다.학습자들로부터 97%의 긍정적인 리뷰율을 받았습니다.

리눅스 프로세스 및 백그라운드 실행 이해

이 단계에서는 리눅스 프로세스에 대해 배우고 & 연산자를 사용하여 백그라운드에서 명령을 실행하는 방법을 배웁니다.

리눅스 프로세스란 무엇인가요?

리눅스에서 프로세스는 실행 중인 프로그램의 인스턴스입니다. 각 프로세스는 고유한 프로세스 ID (PID) 를 가지며 다른 프로세스와 독립적으로 실행됩니다. 터미널에서 명령을 실행하면 프로세스가 시작됩니다.

백그라운드에서 프로세스 실행하기

일반적으로 터미널에서 명령을 실행할 때, 다른 명령을 실행하기 전에 해당 명령이 완료될 때까지 기다려야 합니다. 그러나 명령 끝에 앰퍼샌드 &를 추가하여 백그라운드에서 명령을 실행할 수 있습니다.

이것을 시도해 봅시다:

  1. 프로젝트 디렉토리로 이동합니다:

    cd ~/project
  2. 장시간 실행되는 작업을 시뮬레이션하는 간단한 스크립트를 만듭니다:

    nano long_task.sh
  3. 스크립트에 다음 내용을 추가합니다:

    #!/bin/bash
    echo "PID $$로 장시간 작업 시작"
    sleep 5
    echo "장시간 작업 완료"
  4. Ctrl+O를 누르고 Enter를 누른 다음 Ctrl+X를 눌러 파일을 저장하고 종료합니다.

  5. 스크립트를 실행 가능하게 만듭니다:

    chmod +x long_task.sh
  6. 스크립트를 정상적으로 실행합니다:

    ./long_task.sh

    다음과 같은 출력을 볼 수 있습니다:

    PID 1234 로 장시간 작업 시작
    장시간 작업 완료

    명령 프롬프트를 다시 받기 전에 스크립트가 완료될 때까지 기다려야 했습니다.

  7. 이제 스크립트를 백그라운드에서 실행합니다:

    ./long_task.sh &

    다음과 같은 출력을 볼 수 있습니다:

    [1] 1235
    PID 1235 로 장시간 작업 시작

    [1]은 작업 번호이고 1235는 PID 입니다. 명령 프롬프트를 즉시 다시 받는 것을 알 수 있습니다.

  8. 약 5 초 후에 다음을 볼 수 있습니다:

    장시간 작업 완료
    [1]+  Done                    ./long_task.sh

    이는 백그라운드 프로세스가 완료되었음을 나타냅니다.

백그라운드에서 명령을 실행하면 쉘은 더 많은 명령을 입력할 수 있도록 허용하기 전에 해당 명령이 완료될 때까지 기다리지 않습니다. 이는 여러 작업을 동시에 실행하는 데 유용합니다.

wait 명령어를 사용하여 프로세스 동기화

이 단계에서는 wait 명령을 사용하여 프로세스를 동기화하고, 부모 프로세스가 백그라운드 프로세스가 완료될 때까지 기다리도록 하는 방법을 배웁니다.

wait 명령이란 무엇인가요?

wait 명령은 쉘 스크립트에서 하나 이상의 백그라운드 프로세스가 완료될 때까지 스크립트의 실행을 일시 중지하는 데 사용됩니다. 이는 특정 작업이 후속 작업을 진행하기 전에 완료되도록 해야 할 때 특히 유용합니다.

인자 없이 wait 사용하기

인자 없이 사용하면 wait 명령은 모든 백그라운드 프로세스가 완료될 때까지 기다립니다.

이를 보여주는 스크립트를 만들어 봅시다:

  1. 프로젝트 디렉토리로 이동합니다:

    cd ~/project
  2. 새 스크립트를 만듭니다:

    nano wait_demo.sh
  3. 스크립트에 다음 내용을 추가합니다:

    #!/bin/bash
    
    echo "백그라운드 작업 시작..."
    
    ## 두 개의 백그라운드 작업 시작
    ./long_task.sh &
    ./long_task.sh &
    
    echo "모든 백그라운드 작업이 완료될 때까지 기다리는 중..."
    wait
    echo "모든 백그라운드 작업이 완료되었습니다!"
  4. Ctrl+O를 누르고 Enter를 누른 다음 Ctrl+X를 눌러 편집기를 저장하고 종료합니다.

  5. 스크립트를 실행 가능하게 만듭니다:

    chmod +x wait_demo.sh
  6. 스크립트를 실행합니다:

    ./wait_demo.sh

    다음과 유사한 출력을 볼 수 있습니다:

    백그라운드 작업 시작...
    PID 1236 으로 장시간 작업 시작
    PID 1237 으로 장시간 작업 시작
    모든 백그라운드 작업이 완료될 때까지 기다리는 중...
    장시간 작업 완료
    장시간 작업 완료
    모든 백그라운드 작업이 완료되었습니다!

두 개의 장시간 작업이 모두 완료된 후에만 "모든 백그라운드 작업이 완료되었습니다!" 메시지가 나타나는 것을 확인하세요. 이는 wait 명령이 모든 백그라운드 프로세스가 완료될 때까지 스크립트를 일시 중지하는 방법을 보여줍니다.

특정 PID 와 함께 wait 사용하기

또한 PID 를 제공하여 특정 프로세스를 기다리기 위해 wait를 사용할 수 있습니다:

  1. 다른 스크립트를 만듭니다:

    nano wait_pid_demo.sh
  2. 다음 내용을 추가합니다:

    #!/bin/bash
    
    echo "백그라운드 작업 시작..."
    
    ## 두 개의 백그라운드 작업을 시작하고 PID 를 캡처합니다.
    ./long_task.sh &
    pid1=$!
    
    ./long_task.sh &
    pid2=$!
    
    echo "첫 번째 프로세스 PID: $pid1"
    echo "두 번째 프로세스 PID: $pid2"
    
    echo "첫 번째 작업이 완료될 때까지 기다리는 중..."
    wait $pid1
    echo "첫 번째 작업이 완료되었습니다!"
    
    echo "두 번째 작업이 완료될 때까지 기다리는 중..."
    wait $pid2
    echo "두 번째 작업이 완료되었습니다!"
  3. Ctrl+O를 누르고 Enter를 누른 다음 Ctrl+X를 눌러 편집기를 저장하고 종료합니다.

  4. 스크립트를 실행 가능하게 만듭니다:

    chmod +x wait_pid_demo.sh
  5. 스크립트를 실행합니다:

    ./wait_pid_demo.sh

    출력은 스크립트가 각 프로세스를 개별적으로 기다리는 것을 보여줍니다.

$! 변수는 가장 최근에 실행된 백그라운드 프로세스의 PID 를 포함합니다. 이를 통해 PID 를 캡처하고 나중에 wait 명령과 함께 사용할 수 있습니다.

wait 반환 상태 처리

이 단계에서는 백그라운드 프로세스의 종료 상태를 반영하는 wait 명령의 반환 상태를 캡처하고 처리하는 방법을 배웁니다.

종료 및 반환 상태 이해

리눅스에서 모든 명령은 완료되면 종료 상태를 반환합니다. 종료 상태 0 은 일반적으로 성공을 나타내고, 0 이 아닌 값은 오류 또는 실패의 형태를 나타냅니다.

wait 명령은 대기 중인 명령의 종료 상태를 반환합니다. 여러 프로세스를 기다리는 경우, 종료된 마지막 프로세스의 종료 상태를 반환합니다.

이를 보여주는 스크립트를 만들어 봅시다:

  1. 프로젝트 디렉토리로 이동합니다:

    cd ~/project
  2. 성공하는 스크립트를 만듭니다:

    nano success_task.sh
  3. 다음 내용을 추가합니다:

    #!/bin/bash
    echo "성공 작업 시작"
    sleep 2
    echo "성공 작업이 성공적으로 완료되었습니다"
    exit 0 ## 성공 상태로 종료
  4. Ctrl+O를 누르고 Enter를 누른 다음 Ctrl+X를 눌러 저장하고 종료합니다. 그런 다음 실행 가능하게 만듭니다:

    chmod +x success_task.sh
  5. 실패하는 스크립트를 만듭니다:

    nano fail_task.sh
  6. 다음 내용을 추가합니다:

    #!/bin/bash
    echo "실패 작업 시작"
    sleep 3
    echo "실패 작업에서 오류가 발생했습니다"
    exit 1 ## 오류 상태로 종료
  7. Ctrl+O를 누르고 Enter를 누른 다음 Ctrl+X를 눌러 저장하고 종료합니다. 그런 다음 실행 가능하게 만듭니다:

    chmod +x fail_task.sh
  8. 이제 wait 상태를 캡처하는 스크립트를 만듭니다:

    nano wait_status_demo.sh
  9. 다음 내용을 추가합니다:

    #!/bin/bash
    
    echo "성공적인 백그라운드 작업 실행 중..."
    ./success_task.sh &
    wait
    
    wait_status=$?
    echo "Wait 가 상태로 반환되었습니다: $wait_status"
    
    if [ $wait_status -eq 0 ]; then
      echo "백그라운드 작업이 성공했습니다!"
    else
      echo "백그라운드 작업이 상태로 실패했습니다: $wait_status"
    fi
    
    echo ""
    echo "실패하는 백그라운드 작업 실행 중..."
    ./fail_task.sh &
    wait
    
    wait_status=$?
    echo "Wait 가 상태로 반환되었습니다: $wait_status"
    
    if [ $wait_status -eq 0 ]; then
      echo "백그라운드 작업이 성공했습니다!"
    else
      echo "백그라운드 작업이 상태로 실패했습니다: $wait_status"
    fi
  10. Ctrl+O를 누르고 Enter를 누른 다음 Ctrl+X를 눌러 저장하고 종료합니다. 그런 다음 실행 가능하게 만듭니다:

    chmod +x wait_status_demo.sh
  11. 스크립트를 실행합니다:

    ./wait_status_demo.sh

    다음과 유사한 출력을 볼 수 있습니다:

    성공적인 백그라운드 작업 실행 중...
    성공 작업 시작
    성공 작업이 성공적으로 완료되었습니다
    Wait가 상태로 반환되었습니다: 0
    백그라운드 작업이 성공했습니다!
    
    실패하는 백그라운드 작업 실행 중...
    실패 작업 시작
    실패 작업에서 오류가 발생했습니다
    Wait가 상태로 반환되었습니다: 1
    백그라운드 작업이 상태로 실패했습니다: 1

이는 쉘 스크립트에서 오류 처리에 필수적인 wait 명령의 반환 상태를 사용하여 백그라운드 프로세스가 성공적으로 완료되었는지 여부를 결정하는 방법을 보여줍니다.

실용적인 애플리케이션 완성

이 마지막 단계에서는 배운 내용을 적용하여 시스템 준비 프로세스를 시뮬레이션하는 보다 복잡한 스크립트를 만듭니다. 이 스크립트는 여러 백그라운드 작업을 조정하고 모든 작업이 성공적으로 완료된 후 진행되도록 합니다.

준비 스크립트 만들기

먼저, 서로 다른 준비 작업을 시뮬레이션하는 두 개의 스크립트를 만들겠습니다:

  1. 프로젝트 디렉토리로 이동합니다:

    cd ~/project
  2. 첫 번째 준비 스크립트를 만듭니다:

    nano decorate_hall.sh
  3. 다음 내용을 추가합니다:

    #!/bin/bash
    echo "홀 장식 중..."
    sleep 3
    echo "장식 걸기..."
    sleep 2
    echo "장식 완료."
    exit 0
  4. Ctrl+O를 누르고 Enter를 누른 다음 Ctrl+X를 눌러 저장하고 종료합니다. 그런 다음 실행 가능하게 만듭니다:

    chmod +x decorate_hall.sh
  5. 두 번째 준비 스크립트를 만듭니다:

    nano cook_feast.sh
  6. 다음 내용을 추가합니다:

    #!/bin/bash
    echo "재료 준비 중..."
    sleep 2
    echo "메인 요리 요리 중..."
    sleep 3
    echo "디저트 준비 중..."
    sleep 1
    echo "요리 완료."
    exit 0
  7. Ctrl+O를 누르고 Enter를 누른 다음 Ctrl+X를 눌러 저장하고 종료합니다. 그런 다음 실행 가능하게 만듭니다:

    chmod +x cook_feast.sh

메인 조정 스크립트 만들기

이제 이러한 준비 작업을 조정할 메인 스크립트를 만들어 보겠습니다:

  1. 메인 스크립트를 만듭니다:

    nano prepare_feast.sh
  2. 다음 내용을 추가합니다:

    #!/bin/bash
    
    echo "=== 준비 행사 시작 ==="
    echo "모든 준비 작업 시작..."
    
    ## 백그라운드에서 준비 시작
    ./decorate_hall.sh &
    decoration_pid=$!
    
    ./cook_feast.sh &
    cooking_pid=$!
    
    echo "모든 작업 시작됨. 완료될 때까지 기다리는 중..."
    
    ## 장식이 완료될 때까지 기다립니다.
    wait $decoration_pid
    decoration_status=$?
    
    if [ $decoration_status -eq 0 ]; then
      echo "장식이 성공적으로 완료되었습니다."
    else
      echo "오류: 장식이 상태 $decoration_status 로 실패했습니다"
      exit 1
    fi
    
    ## 요리가 완료될 때까지 기다립니다.
    wait $cooking_pid
    cooking_status=$?
    
    if [ $cooking_status -eq 0 ]; then
      echo "요리가 성공적으로 완료되었습니다."
    else
      echo "오류: 요리가 상태 $cooking_status 로 실패했습니다"
      exit 1
    fi
    
    ## 모든 준비가 성공적으로 완료되었습니다.
    echo "=== 모든 준비가 성공적으로 완료되었습니다! ==="
    echo "이제 행사를 시작할 수 있습니다."
    
    ## 성공적인 완료를 나타내는 확인 파일 만들기
    echo "decoration_status=$decoration_status" > preparation_results.txt
    echo "cooking_status=$cooking_status" >> preparation_results.txt
    echo "overall_status=0" >> preparation_results.txt
    
    exit 0
  3. Ctrl+O를 누르고 Enter를 누른 다음 Ctrl+X를 눌러 저장하고 종료합니다. 그런 다음 실행 가능하게 만듭니다:

    chmod +x prepare_feast.sh
  4. 메인 스크립트를 실행합니다:

    ./prepare_feast.sh

    모든 준비 작업이 동시에 실행되는 출력을 볼 수 있으며, 메인 스크립트는 각 작업이 완료될 때까지 기다린 후 전체 성공을 선언합니다.

스크립트 이해하기

메인 스크립트의 주요 부분을 살펴보겠습니다:

  • &를 사용하여 각 준비 작업을 백그라운드에서 시작합니다.
  • $!를 사용하여 각 작업의 PID 를 캡처합니다.
  • wait $pid를 사용하여 각 작업이 완료될 때까지 기다립니다.
  • 각 작업의 종료 상태를 확인합니다.
  • 결과를 사용하여 확인 파일을 만듭니다.

이 접근 방식을 통해 다음을 수행할 수 있습니다:

  1. 여러 작업을 동시에 실행합니다.
  2. 각 작업의 성공/실패를 모니터링합니다.
  3. 개별 작업이 실패하면 전체 프로세스를 중단합니다.
  4. 결과 기록을 만듭니다.

이는 여러 프로세스를 조정하고 모니터링해야 하는 시스템 관리 및 자동화 스크립트에서 일반적인 패턴입니다.

요약

이 랩에서는 wait 명령을 사용하여 리눅스에서 프로세스를 효과적으로 관리하고 동기화하는 방법을 배웠습니다. 이 중요한 기술을 통해 여러 동시 작업을 조정할 수 있는 보다 정교한 쉘 스크립트를 만들 수 있습니다.

마스터한 주요 개념은 다음과 같습니다:

  • & 연산자를 사용하여 백그라운드에서 프로세스 실행
  • 백그라운드 프로세스가 완료될 때까지 실행을 일시 중지하기 위해 wait 명령 사용
  • PID 로 특정 프로세스 대기
  • wait 명령의 반환 상태 캡처 및 처리
  • 백그라운드 프로세스에 대한 오류 처리 구현
  • 실용적인 시나리오에서 여러 동시 작업 조정

이러한 기술은 리눅스 환경에서 시스템 관리, 자동화 및 쉘 스크립팅의 기본입니다. 프로세스 동기화를 적절하게 관리함으로써 종속 작업의 적절한 순서를 유지하면서 동시성을 활용하는 보다 효율적인 스크립트를 만들 수 있습니다.

빌드 시스템, 배포 스크립트 또는 시스템 관리 도구를 개발하든, 여러 프로세스를 조정하는 능력은 보다 강력하고 효율적인 솔루션을 만들 수 있는 필수 기술입니다.