2012-05-18 2 views
3

들어오는 전자 메일을 처리하여 자신의 업무에서 블랙 박스 응용 프로그램으로 보내는 시스템이 있습니다. 높은 수준의 스크립트는 항상 실행 inittab에 의해 관리하고이 명령으로 실제 작업을 할 수있는 아이 스크립트를 실행한다 :netcat에 연결된 스크립트에서 입력을 처리합니다.

$SCRIPT | nc -l -p $PORT 

자체가 명명 된 파이프에서 읽어 스크립트를,의 구문 분석 및 처리의 비트를 않습니다 데이터를 netcat을 통해 $ PORT에 연결된 프로세스에 다시 셔플하기 전에 echo을 호출하십시오.

내가 필요로하는 것은 내 파이프의 맨 끝에서 들어오는 데이터를 처리하는 몇 가지 방법입니다. 응용 프로그램 내에서 연결을 닫으라는 요청을하면 문자열을 보냅니다. 원하는대로 정의 할 수 있으며 스크립트를 종료 할 때까지 기다립니다. 나는 현재 상대방으로부터 들어오는 데이터를 읽는 기능을 어떻게 추가 할 수 있는지 이해하기 위해 고심하고있다. 파이프를 닫는 명령인지 확인한 다음 스크립트를 종료하십시오.

(요컨대) 내 스크립트는 다음과 같습니다

:

while true ; do 
    email_input="`cat "$pipe"`" 
    if [[ $email_input =~ .*escape_queue.* ]] ; then 
    break; 
    fi 
    echo "`parse`" 
done 

나는 프로그램의 흐름을 변경해야하는 가능성 열려있어, 난 그냥이 얼마나 주위에 내 머리를 정리하고 수 없습니다 새 이메일을 처리 할 때까지 스크립트가 cat $pipe에 블록화되어 비동기 적으로 들어오는 데이터를 읽을 수 있습니다.

명확하지 않은 경우, 나는 초보자 수준의 bash 스크립팅을 사용하고 있으며 항상 개선을위한 제안을합니다.

UPDATE 새 메시지가 FIFO에 파이프되면 나는 스크립트가 종료이 시점에서

$SCRIPT | nc -l -p $PORT > $nc_data 

와 스크립트 자체

netcat_response="`cat "$nc_data"`"; 
if [[ "$netcat_response" =~ "exit" ]] ; then 
    cat /dev/null > $nc_data 
    break; 
fi 

내에서 내 스크립트 호출을 변경 한 . 즉, 스크립트가 읽을 때마다 항상 1 개의 메시지를 잃어 버리고 스크립트가 종료됩니다. 무언가가 읽을 때까지 스크립트는 여전히 cat에서 차단됩니다. 최악의 시나리오가 필요합니다.

+1

'email_input'에 대한 할당에서 외부 따옴표를 사용할 필요가 없으며 backticks 대신 '$()'를 사용하는 것이 좋습니다. Bash는'cat'의 일을 할 수 있습니다 :'email_input = $ (< "$ pipe")'. 또한 파일을 자르려면 :> "$ nc_data"' –

+0

도움이됩니다. 감사합니다 – Grambot

답변

3

stdin의 EOF로부터 일정 시간 후에 nc를 종료 할 수 있습니다.

$SCRIPT | nc -l -q 5 -p $PORT > $nc_data 

-q은 특정 시간 (초) 후에 종료 할 수있는 옵션입니다.

+0

답장을 보내 주셔서 감사합니다. 문제가 해결되지만 불행히도 다음과 같은 결과가 나타납니다.'nc : illegal option - q' – Grambot

+0

이 배포판/운영체제는 무엇입니까? – staticsafe

+0

FreeBSD 인 경우 -w 옵션 – staticsafe

관련 문제