2014-09-11 5 views
1

직렬 포트의 출력을 기록하는 로그 파일이 있습니다. 일치하는 행이 발견되면 검색을 종료하고 나머지 스크립트와 함께 계속합니다.로그 파일을 모니터링하는 동안 오류 처리

때때로 문제가되는 것은 아니지만 때로는 직렬을 통해 기록되는 컴퓨터가 중단되어 사용자 입력을 기다리는 경우가 있습니다 ("계속하려면 아무 키나 누르십시오").

현재의 스크립트는 특정 문자열 Login:만을 찾고 있으므로 echo 반환을 묻지 않고 Login: 문자열을 계속 찾으십시오.

case 또는 if 문을 다음 스크립트에 추가하는 쉬운 방법이 있습니까? 다음 Press any key to continue, echo \r을하고 프롬프트 발생하지 않는 경우 Login: 프롬프트에 대한 검색을 계속 :

cat /dev/ttyS0 > serial.log & 
catPID=$! 
sh -c 'tail -n +0 -f serial.log | { sed "/Login:/ q" && kill $$ ;}' & 
searchPID=$! 
wait "$searchPID" 
kill "$catPID" 
echo "Admin" > /dev/ttyS0 

나는 스크립트 문자열 여부를 확인 할 수있는 방법이 필요합니다.

+1

내가 실제로 여기에서하려고하는 내용을 잘 모르겠지만 for ['expect'] (http://expect.sourceforge.net/)를 사용하고 싶을 수도 있습니다. –

답변

0

Etan이 말했듯이 이것은 expect의 직업입니다. 예상 할 수 없거나 기대할 수없는 경우 여기에 가난한 사람이 기대하는 대안이 있습니다.

+0

이것은 대부분 작동하지만 루프가 끝난 후에'read'가 종료되지 않는 것처럼 보입니다. 하지만'Login :'다음에 ">/dev/ttyS0'가"echo "되면 echo가 끝납니다. 'case'가 끝난 후에 왜 빠져 나오지 않는가? @ jm666 – BenTech2

+0

@ BenTech2 아마도 'fromserial | while'은 서브 쉘에서 실행됩니다. 지금 시도 - 편집. 어쨌든 이상한데 왜냐하면'bash script '(임의의'fromserial' 함수 사용)를 시도 할 때 저를 위해 종료되기 때문입니다 ... 스크립트를 다소 수정 했습니까? – jm666

+0

고마워, 그랬어. 'case'가 완료된 후 스크립트를 계속하기 위해'exit'를'break'로 변경했습니다. – BenTech2