백그라운드 프로세스가 끝날 때까지 함수가 반환되지 않는 이유는 무엇입니까?

백그라운드 프로세스가 끝날 때까지 함수가 반환되지 않는 이유는 무엇입니까?

다음 스크립트를 고려해보세요.

#!/bin/bash
function start {
  leafpad &
  echo $!
}
PID=$(start)
echo "PID is $PID"

스크립트는 리프패드 프로세스가 끝날 때까지 닫는 중괄호를 지나 계속 진행되지 않습니다. 이는 백그라운드 프로세스인 경우에도 마찬가지입니다.

왜 이런거야? 함수에서 백그라운드 프로세스를 시작할 수 있습니까?

답변1

함수는 반환되지만 백그라운드 작업을 생성했지만 stdout fd가 여전히 열려 있기 때문에 명령 대체가 차단됩니다. >/dev/null끄기 전에 추가하기 만 하면 됩니다 &.

#!/bin/bash
function start {
  leafpad >/dev/null &
  echo $!
}
PID=$(start)
echo "PID is $PID"

프로세스가 stdin, stdout, stderr도 닫도록 하려면 다음 명령을 사용하십시오.

leafpad >/dev/null 0>&1 2>&1 &

이렇게 하면 stdin(0), stdout(1) 및 stderr(2)가 닫히고 배경(&)이 닫힙니다. 게다가 이것들을 사용할 때에는스트림 리디렉션"스푸핑"되었다는 사실을 잊지 마세요. 즉, 실행 순서대로 복제된다는 의미입니다.

1>/dev/null 2>&1

그리고

2>&1 1>/dev/null

아니 똑같아! 전자에서는 스트림을 /dev/null(원하는 것)에 복사하고, 후자에서는 /dev/stdout을 stderr에 복사한 다음 stdout을 닫습니다. 따라서 전송된 모든 메시지는 stderr콘솔에 표시됩니다.

관련 정보