2014-12-08 2 views
1

요구 사항은 다음과 같습니다bash는 자식 프로세스를 정지하기 전에 값을 얻을 수있는 방법

  1. 자식 프로세스는 값, IP 주소를 반환합니다, 그것은
  2. 하지만 자식 프로세스가 어쩌면 중단 wget과 방법을 사용합니다.
  3. 상위 프로세스가 하위 프로세스를 대기시킬 수 없으므로 몇 초 후에 반환 값이 필요합니다.

가능한 스크립트입니다

parent.sh :

./child.sh & 
sleep 60 
echo child_return_value 

child.sh : 내가 -T 사용하는 것이

child_return_value=$(wget ipaddress) 

답변

3

다른 가능한 접근법을 추가하기 만하면 쉘이 지원하는 경우 프로세스 대체를 사용하여 (수동으로) 파일을 사용하지 않고 백그라운드 프로세스의 출력을 캡처 할 수 있습니다. 쉘은 실제로이 솔루션에서 사용자를 대신하여 FIFO 또는/dev/FD/XX 특수 파일을 생성합니다

exec 3< <(wget -O- ipaddress); 
read -r -u3 -t60; 
return_value="$REPLY"; 
exec 3<&-; 
echo "$return_value"; 

: 당신은 시간 제한 값을 설정 허용 출력을 얻을 수있는 read 내장을 사용할 수 있습니다.

+0

감사하지만, exec만이 스크립트가 아닌 쉘에서 실행되는 것처럼 보입니다. 어떻게 완화시킬 수 있습니까? – netawater

+0

스크립트는 쉘 명령 파일입니다. 스크립트를 실행할 때 쉘은 쉘 프롬프트에서 사람이 입력 한 것처럼 각 행을 읽고 명령을 실행합니다. 'exec'는 대화식으로 (즉, 쉘 프롬프트에서) 그리고 스크립트에서 모두 작동해야합니다. 어떤 오류가보고 있습니까? – bgoldst

+0

./get_current_ip.sh : 9 행 : 예상치 못한 토큰 근처에서 구문 오류가 발생했습니다. < ./get_current_ip.sh : 줄 9 :'exec 3 <(wget -q -O - "http : //checkip.dyndns. co.kr/"); ' 하지만 쉘에서이 줄을 실행해도 좋습니다. – netawater

3

|에 wget과의 --timeout 옵션을 지정된 시간 (초) 후에 요청 시간이 초과되었습니다. 이렇게하면, 당신은 완전히 백그라운드 프로세스와 IPC 덤비는 방지 할 수 있습니다

return_value=$(wget -T60 -O- ipaddress); ## 60 sec timeout 
echo "$return_value"; 
+0

대단히 고맙습니다. openwrt의 wget에는 -T 옵션이 없습니다. – netawater

0

당신은 자식 프로세스가 부모 프로세스가 읽을 수있는 파일에 결과를 쓰기 가질 수있다.

child_out="$(mktemp)" 
./child.sh > "$child_out" & 
sleep 60 
if [ -s "$child_out" ] 
then 
    child_return_value=$(cat "$child_out") 
else 
    # Child did not produce a result yet. 
fi 

상위 스크립트에서 임시 파일을 삭제하는 것을 잊지 마십시오. 가급적 트랩을 사용하여 모든 (잘, 대부분의) 환경에서 제거되도록 함.

+0

감사합니다. 임시 파일을 사용하지 않는 것이 좋습니다. – netawater

관련 문제