다음 스크립트를 고려해보세요.
#!/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
콘솔에 표시됩니다.