Linux에서 wait 명령을 사용하는 방법은 무엇입니까?

Linux에서 wait 명령을 사용하는 방법은 무엇입니까?
#!/bin/bash
function back()
{
    sleep $1
    exit $2
}
back $1 $2 &
b=$!
if `wait $!`;then
    echo success
else
    echo failure
fi
bash-3.00# ./back 300 0
failure
bash-3.00# ./back 300 1
failure

0을 보내면 success종료 상태가 예상되지만 여전히 수신됩니다 failure.

또한 wait300초의 대기 시간이 없습니다. 대신에 즉시 메시지를 받습니다. 나는 $!스크립트에서 직계 자식을 가정하고 있습니다 $$. 아니요?

wait와 같은 종료 상태를 캡처할 수 있습니까 exit_status=$(wait $!)?

if ! ((exit_status));then
    echo sucess
else
    failure
fi

답변1

wait문제는 서브셸에서 다음을 실행 한다는 것입니다.

if `wait $!`;then

wait명령어가 아닌 내장 명령어이기 때문에서브쉘, 현재 쉘이 아닙니다.

표시되지만 표시되지 않는 출력은 다음과 같습니다.

wait: pid 12344 is not a child of this shell

...반환 상태는 1입니다.

테스트를 수행하려면 서브셸을 사용하지 않고 테스트해야 합니다.

#!/bin/bash
function back()
{
  sleep $1
  exit $2
}
back $1 $2 &
b=$!

wait $b && echo success || echo failure

이는 예상한 결과를 제공하고 예상한 시간을 기다립니다.

$ time ./test.sh 3 0
success
./test.sh 3 0  0.00s user 0.01s system 0% cpu 3.012 total
$ time ./test.sh 3 1
failure
./test.sh 3 1  0.00s user 0.01s system 0% cpu 3.012 total

다음을 사용하여 명령의 종료 상태를 확인할 수 있습니다 $?.

$ /bin/true
$ echo $?
0
$ /bin/false
$ echo $?
1

스크립트에 다른 오류가 있습니다. 라인 #!형식이 잘못되었습니다. 수정했습니다. $!에 할당했지만 $b을 사용하지 마십시오 $b.

답변2

백틱을 제거하세요.

이제 wait상위 셸의 작업에 액세스할 수 없는 하위 셸에서 실행 중이므로 즉시 실패합니다.


$?종료 상태를 원할 경우 대기 후 즉시 값을 가져옵니다.

command_here &
wait
status=$?

답변3

백틱을 제거하면 프로그램이 올바르게 실행되지만 이미 확인된 이유 때문은 아닙니다. 사실, wait상위 프로세스에 액세스할 수 없는 하위 쉘에서 실행되기 때문에 즉시 실패하지만 유효한 명령을 사용하더라도 프로그램이 예상대로 실행되지 않습니다.

if문은 프로그램을 실행하고 종료 상태가 0인지 0이 아닌지 확인합니다. 백틱을 사용하면 if 문은 다음을 수행합니다.산출프로세스를 프로그램으로 실행한 다음 해당 프로세스의 종료 코드를 사용해 보세요. 따라서 프로그램은 wait실패했기 때문에 실패하는 것이 아니라, wait출력을 생성하지 않기 때문에 실패합니다.

echo백틱 내부를 사용하여 스크립트가 작동하도록 할 수 있습니다.

if `echo wait $!`; then
    echo success
else
    echo failure
fi

아니면 누구나 쉽게 백틱을 제거할 수 있습니다.

관련 정보