예제가 포함된 Bash wait 명령

Bash의 wait 명령은 셸 스크립트 프로세스를 관리하기 위한 강력한 도구입니다. 주로 지정된 백그라운드 프로세스가 완료될 때까지 스크립트 실행을 일시 중지하는 데 사용됩니다. 이 명령은 여러 백그라운드 작업을 시작하고 추가 작업을 진행하기 전에 완료를 동기화해야 하는 스크립트에서 유용합니다. wait 명령은 개별 프로세스 ID(PID)에 적용하거나 현재 셸 세션에서 시작한 모든 백그라운드 프로세스를 기다리는 데 사용할 수 있습니다. wait을 사용하면 특정 작업이 완전히 완료될 때만 스크립트가 진행되도록 하여 자동화 프로세스를 보다 안정적이고 효율적으로 만들 수 있습니다.

이 가이드는 다양한 시나리오에서 wait 명령을 사용하는 실제 예제를 제공하여 Bash 스크립트에서 백그라운드 프로세스를 효과적으로 관리하는 방법을 이해하는 데 도움이 됩니다.

Bash 대기 명령 이해

Bash의 wait 명령은 지정된 작업이 완료될 때까지 현재 셸의 실행을 중지하는 내장 기능입니다. 그런 다음 기다리고 있던 명령의 종료 상태를 반환합니다. 이 명령은 쉘 실행 환경에서 중요한 역할을 하므로 대부분의 쉘에 내장되어 있습니다.

wait 명령의 일반 구문은 다음과 같습니다.

wait [ID]

이 컨텍스트에서 ID는 프로세스 또는 작업 ID를 나타냅니다. ID가 지정되지 않으면 wait 명령은 모든 자식 백그라운드 작업이 완료될 때까지 일시 중지됩니다. wait 명령은 마지막으로 기다린 명령의 종료 상태를 반환합니다.

예를 들어 PID 7654를 사용하여 백그라운드 프로세스를 일시 중지하려면 다음을 사용합니다.

wait 7654

여러 프로세스가 지정된 경우 wait 명령은 프로세스가 완료될 때까지 일시 중지됩니다.

bash wait 명령을 사용하여 작업 사양 탐색

작업은 작업을 구성하는 프로세스를 나타내는 작업 사양(jobspec)을 사용하여 지정됩니다. jobspec은 백분율 기호로 시작하고 그 뒤에 작업 번호(%n)가 옵니다. 다음은 예입니다.

rsync -a /home /tmp/home &

이 명령은 백그라운드에서 실행됩니다. 셸 작업 ID(괄호로 묶음)와 프로세스 ID가 터미널에 표시됩니다. 작업을 일시 중지하려면 wait 명령과 작업 사양을 차례로 실행합니다.

wait %2

bash wait 명령과 함께 -n 옵션 활용

-n 옵션을 사용하면 wait 명령이 지정된 PID 또는 작업 사양의 단일 작업이 완료될 때까지만 일시 중지하고 종료 상태를 반환할 수 있습니다. 인수가 제공되지 않으면 wait -n은 백그라운드 작업이 완료될 때까지 기다리고 작업 종료 상태를 반환합니다.

wait -n 45432 54346 76573

위의 예에서 wait -n은 먼저 종료되는 작업의 반환 상태만 인쇄합니다. 작업의 PID는 표시하지 않습니다. 종료 상태가 반환되는 작업 PID 또는 jobspec을 가져오려면 다음을 사용합니다. -p 변수에 할당하는 옵션:

wait -p job_id -n 45432 54346 76573

-p 옵션은 Bash 5.1에서 도입되었습니다. 이전 Bash 버전을 사용하면 "잘못된 옵션" 오류가 발생합니다.

bash wait 명령을 사용하여 -f 옵션 탐색

-f 옵션은 작업 상태가 변경될 때 반환하는 대신 종료 코드를 반환하기 전에 각 PID 또는 작업 사양이 종료될 때까지 일시 중지할 때까지 기다리도록 지시합니다. 이 옵션은 작업 제어가 활성화된 경우에만 유효하며, 기본적으로 대화형 프롬프트에 대해서만 활성화됩니다.

wait 명령의 실제 예

wait 명령은 일반적으로 병렬로 실행되는 하위 프로세스를 생성하는 쉘 스크립트에서 사용됩니다. 명령이 어떻게 작동하는지 설명하기 위해 다음 스크립트를 만들어 보겠습니다.

#!/bin/bash
sleep 30 &
process_id=$!
echo "PID: $process_id"
wait $process_id
echo "Exit status: $?"

코드를 한 줄씩 분석해 보겠습니다.

  • 첫 번째 줄인 shebang은 운영 체제에 나머지 파일을 구문 분석하는 데 사용할 인터프리터를 알려줍니다.
  • 우리는 시간이 많이 걸리는 백그라운드 프로세스를 에뮬레이트하기 위해 sleep 명령을 사용하고 있습니다.
  • $! 백그라운드에서 실행된 마지막 작업의 PID를 저장하는 내부 Bash 변수입니다. 이 예에서 이는 sleep 명령의 PID입니다. PID를 변수(process_id)에 저장합니다.
  • PID 번호가 인쇄됩니다.
  • PID는 sleep 명령이 완료될 때까지 일시 중지되는 wait 명령에 전달됩니다.
  • wait 명령의 종료 상태가 인쇄됩니다. $? 마지막으로 실행된 명령의 종료 상태를 유지하는 내부 Bash 변수입니다.

스크립트를 실행하면 다음과 같이 인쇄됩니다.

PID: 36353
Exit status: 0

-n 옵션을 사용한 예는 다음과 같습니다.

#!/bin/bash
sleep 3 &
sleep 30 &
sleep 5 &
wait -n
echo "First job completed."
wait
echo "All jobs completed."

스크립트가 실행되면 3개의 백그라운드 프로세스가 생성됩니다. wait -n은 첫 번째 작업이 완료되고 echo 문이 인쇄될 때까지 일시 중지합니다. 모든 하위 백그라운드 작업이 완료될 때까지 일시 중지됩니다.

First job completed.
All jobs completed.

마지막 예에서는 -f 옵션을 설명합니다. 터미널을 열고 다음을 실행하세요.

sleep 3600 &
[1] 46671
wait 46671

다른 터미널을 열고 kill 명령을 사용하여 프로세스를 중지합니다.

kill -STOP 46671

프로세스 상태가 변경되면 대기 명령이 완료되고 프로세스 종료 코드가 반환됩니다.

이제 동일한 단계를 반복하되 이번에는 wait -f $pid를 사용합니다.

sleep 3600 &
wait -f 46671

다른 터미널에서 프로세스를 중지합니다.

kill -STOP 46671

이번에는 wait 명령이 완료되지 않습니다. sleep 프로세스가 종료될 때까지 실행됩니다.

wait 명령의 고급 사용법

wait 명령은 스크립트에서 여러 프로세스를 관리할 때 특히 유용합니다. 실행 흐름을 제어하고 다른 프로세스가 시작되기 전에 특정 프로세스가 완료되었는지 확인할 수 있습니다. 이를 설명하기 위해 좀 더 복잡한 예를 살펴보겠습니다.

Bash는 여러 프로세스를 기다립니다.

여러 프로세스가 백그라운드에서 실행되고 완료한 후에만 조치를 취해야 하는 시나리오를 생각해 보세요. wait 명령을 사용하여 이를 달성하는 방법은 다음과 같습니다.

#!/bin/bash
echo "Starting process 1..."
sleep 10 &
pid1=$!

echo "Starting process 2..."
sleep 15 &
pid2=$!

echo "Starting process 3..."
sleep 20 &
pid3=$!

echo "Waiting for processes to complete..."
wait $pid1 $pid2 $pid3
echo "All processes completed."

이 스크립트는 각각 10초, 15초, 20초 동안 대기하는 세 가지 백그라운드 프로세스를 시작합니다. 각 프로세스의 PID를 변수에 저장합니다. 그런 다음 세 가지 PID를 모두 인수로 사용하여 wait 명령을 사용합니다. 스크립트는 세 가지 프로세스가 모두 완료될 때까지 wait 명령에서 일시 중지됩니다.

루프와 함께 Bash 대기 사용

루프와 함께 wait을 사용하여 여러 프로세스를 관리할 수도 있습니다. 다음은 예입니다.

#!/bin/bash
for i in {1..5}
do
   echo "Starting process $i..."
   sleep $i &
   pids[${i}]=$!
done

echo "Waiting for processes to complete..."
for pid in ${pids[*]}; do
    wait $pid
done

echo "All processes completed."

이 스크립트에서는 루프 내에서 5개의 백그라운드 프로세스를 시작합니다. 각 프로세스는 루프의 인덱스와 동일한 몇 초 동안 휴면 상태입니다. 각 프로세스의 PID를 배열에 저장합니다. 모든 프로세스를 시작한 후 배열을 반복하고 wait 명령을 사용하여 각 프로세스를 개별적으로 일시 중지합니다. 스크립트는 해당 프로세스가 완료될 때까지 각 대기 명령에서 일시 중지됩니다.

결론

Bash의 wait 명령은 스크립트 내에서 백그라운드 프로세스를 동기화하는 데 필수적입니다. wait을 사용하는 방법을 이해하면 스크립트의 흐름을 보다 정확하게 제어하여 작업이 원하는 순서대로 완료되도록 할 수 있습니다. 여러 백그라운드 작업을 처리하든 특정 프로세스가 완료되어야 진행하든 wait 명령은 보다 안정적이고 예측 가능한 스크립트 동작을 달성하는 데 도움이 될 수 있습니다. 프로세스 관리를 강화하고 전반적인 스크립트 효율성을 개선하기 위해 wait을 스크립트에 통합하는 것을 고려하세요.

Joshua James

코멘트를 남겨주세요