명령이 종료되지 않습니다
echo `bash -c 'tail -f /dev/null & echo hello world'`
사실에도 불구하고
bash -c 'tail -f /dev/null & echo hello world'
"hello world"를 올바르게 반환합니다.
백틱 내에서 평가되는 bash 스크립트의 명령을 배경으로 설정하려고 합니다. 실제로 이 예제에서 사용하고 있는 echo 대신 eval을 실행해야 합니다. 문제의 스크립트는 일반적으로 많은 내보내기 문을 출력하는 SSH 에이전트를 에뮬레이션합니다. 그러나 스크립트에는 배경 작업이 필요합니다.
백틱 대신 또는 disown
을 사용해 보았습니다 . 백틱은 항상 모든 하위 프로세스가 종료되기를 기다리는 것 같습니다. 이 문제를 해결할 방법이 있나요? 특히 백그라운드 명령의 PID를 받는 데 관심이 있습니다.nohup
$()
답변1
존재하다:
echo `shell code`
다음은 더 이상 사용되지 않는 형식입니다.
echo $(shell code)
shell code
서브쉘에서 평가되며,모두출력 후 후행 줄 바꿈을 제거하고 인용하는 것을 잊었으므로 에 인수로 분할+glob을 전달합니다 echo
.
이를 위해 쉘은 서브쉘의 stdout을 파이프로 만들고 파이프의 다른 쪽 끝에서 쉘은 파일 끝까지, 즉 stdout(또는 다른 fd)이 있는 모든 것이 열릴 때까지 출력을 읽습니다. 파이프를 닫고 해당 fd를 닫거나 종료하십시오.
존재하다:
echo "$(sleep 10 & echo done)"
sleep 10
비동기적으로 실행 중이고 하위 쉘이 종료될 때까지 기다리지 않더라도 실행 중인 프로세스는 여전히 sleep
파이프에 stdout(fd 1)이 열려 있고 종료될 때까지 그대로 유지되므로 쉘은 종료될 때까지 기다려야 합니다 sleep
. 더 이상 읽을 수 있는 출력이 없다는 것을 알 때까지 종료됩니다.
다음과 같이 변경하면:
echo "$(sleep 10 > /dev/null & echo done)"
이 경우 파이프에 열려 있는 fd가 없기 sleep
때문에 백그라운드에서 실행되는 동안 즉시 반환되는 것을 볼 수 있습니다 .sleep
답변2
특히 백그라운드 명령의 PID를 받는 데 관심이 있습니다.
내 생각엔 당신이 pid 를 원하지 tail
않는 것 같아요 bash
.
bash -c
그냥 사용할 필요는 없습니다
tail -f /dev/null & echo $!