백그라운드에서 기능을 시작하고 PID를 저장합니다.

백그라운드에서 기능을 시작하고 PID를 저장합니다.

두 가지 기능이 포함된 스크립트가 있습니다. 함수는 다른 함수를 백그라운드 프로세스로 시작하고 해당 프로세스의 UID를 반환합니다. PID를 개인 변수에 넣지 않으려는 한 이것은 잘 작동합니다. PID를 변수에 할당하려고 하면 백그라운드 작업이 완료될 때까지 스크립트가 정지됩니다.

이 동작은 다음 스크립트를 사용하여 시연할 수 있습니다.

#!/bin/sh

foo () {
    bar &   # start bar in background
    echo $! # return bars' PID
}

bar () {
    sleep 5 # some background operation
}

FOO=$(foo) # remember the PID of bar
echo $FOO  # expectation: should echo immediately
           # reality: echo after five seconds

bar그래서 제 질문은: 함수를 시작한 후 bar반환을 기다리지 않고 스크립트가 계속 실행되도록 하려면 어떻게 해야 합니까 ?

답변1

메인 쉘이 명령 대체가 더 이상의 입력을 캡처하지 않는다는 것을 알 수 있도록 이 서브쉘에 의해 시작된 서브쉘은 $(foo)완전히 종료되어야 합니다(모든 백그라운드 프로세스도 포함). 결국, bar자고 난 후에 뭔가를 출력할 수 있습니다.

그러나 출력을 bar다음으로 리디렉션할 수 있습니다 /dev/null.

foo () { 
    bar > /dev/null &
    echo "$!"
}

또는 (Bash 또는 ksh에서) 명령 대체를 취소하고 bar기본 셸에서 실행합니다.

foo() {
    typeset -n _pid=$1
    bar &
    _pid=$!
}
foo FOO
echo "$FOO"

eval(또는 표준과 동일합니다 sh.)

관련 정보