SW/리눅스

Linux : Bash : wait 명령어, 예제, 사용 방법

얇은생각 2023. 1. 11. 07:30
반응형

wait는 지정된 작업이 완료될 때까지 대기하고 waited 명령의 종료 상태를 반환하는 명령입니다.

wait 명령은 현재 셸 실행 환경에 영향을 미치기 때문에 대부분의 셸에서 기본 제공 명령으로 구현됩니다.

Bash 기본 제공 대기 명령에 대해 살펴보겠습니다.

 

 

Linux : Bash : wait 명령어, 예제, 사용 방법

 

 

Bash wait 명령

대기 기본 제공의 일반 구문은 다음 형식을 사용합니다.

wait [options] ID

 

 

ID는 프로세스 또는 작업 ID입니다. ID가 지정되지 않은 경우 명령은 모든 하위 백그라운드 작업이 완료될 때까지 기다립니다.

wait 명령은 마지막으로 대기한 명령의 종료 상태를 반환합니다.

예를 들어 PID 7654에서 백그라운드 프로세스를 대기하려면 다음을 사용합니다.

wait 7654

 

 

여러 프로세스가 지정된 경우 명령은 모든 프로세스가 완료될 때까지 기다립니다.

작업은 작업을 구성하는 프로세스를 참조하는 방법인 작업 규격("jobspec")을 사용하여 지정합니다. 작업 규격은 백분율 기호 다음에 작업 번호(%n)로 시작합니다. 다음은 예입니다.

백그라운드에서 명령을 실행합니다.

rsync -a /home /tmp/home &

# [2] 54377

 

 

셸 작업 ID(괄호로 둘러싸임)와 프로세스 ID가 터미널에 표시됩니다.

작업을 대기하려면 wait 명령과 작업 사양을 차례로 실행합니다.

wait %2

 

 

-n 옵션과 함께 호출되면 명령은 지정된 pid 또는 작업 사양의 단일 작업만 완료되기를 기다렸다가 종료 상태를 반환합니다. 인수가 제공되지 않은 경우 -n은 백그라운드 작업이 완료될 때까지 기다렸다가 작업 종료 상태를 반환합니다.

wait -n 45432 54346 76573

 

 

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

wait -p job_id -n 45432 54346 76573

 

 

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

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

 

 

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."


# first job completed
# all jobs completed

 

 

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

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

sleep 3600 &

# [1] 46671

 

 

프로세스를 기다립니다.

wait 46671

 

 

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

kill -STOP 46671

 

 

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

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

sleep 3600 &
wait -f 46671

 

 

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

kill -STOP 46671

 

 

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

wait 명령은 지정된 작업이 완료될 때까지 기다렸다가 작업의 종료 코드를 반환합니다.

반응형