while 루프에서 명령으로 파이프하지만 파이프된 명령이 실패하면 다른 명령을 실행합니다.

while 루프에서 명령으로 파이프하지만 파이프된 명령이 실패하면 다른 명령을 실행합니다.

환경: armv7l GNU/Linux Debian Jessie, GNU bash,v4.3.30(1) - 릴리스(arm-unknown-linux-gnueabihf).

  • do_stuff: STDOUT으로 출력을 생성하는 장기 실행 프로세스
  • compare_output.pl: perl출력에 따라 작업을 수행하는 스크립트입니다.

compare_output.pl프로세스가 중단(죽음)되는 경우 다시 시작할 수 있기를 원합니다 compare_output.pl. 간단한 루프 echo이후에도 while(그리고 이후에도 ) compare_output.pl성공하지 못했습니다.

안타깝게도 프로세스에 대해 캐시/버퍼된 보상을 bash보존하는 방법을 모르겠습니다 .do_stuff

while true;
do
  ...
  do_stuff (which generates lot of output linewise to STDOUT)
  ...
done | compare_output.pl 
#then something like this should happen, while retaining 
#the while loop and being able to "reattach" to the pipe.
"compare_output died? restart it "

때로는 compare_output.pl중단되어(실제로 종료되어) 전체 파이프라인 입력이 손실됩니다. ( compare_output.pl깨지면 안된다는 것은 말할 필요도 없지만 그것은 또 다른 날의 또 다른 질문입니다).

중단 되면 compare_output파이프 출력에 다시 연결할 수 있도록 while 루프를 재사용할 수 있기를 원합니다. 하나 이상의 줄이 누락되는 것은 허용됩니다.

파이프 대신 명령 대체를 사용해 보았습니다.

while true;
do
  ...
  do_stuff (which generates lot of output linewise)
  ...
done < <( compare_output.pl )
# then something like this should happen, while retaining
# the while loop and being able to "reattach" to the pipe.
compare_output died? restart it "

restart_while_loopcompare_output.pl실패(사망) 한 경우

읽기 및 적용 Bash: '읽는 동안' 프로세스 대체 작업이 파이프에서 벗어날 수 없습니다.

compare_output.pl출력을 방해하는 것 외에도, 이것은 내가 죽은 후에 조치를 취하고 싶은 문제를 해결하지 못하는 것 같습니다 .

내가 이걸 할 때CTRL-C그런 다음 my 가 echo test실행됩니다. 이는 . 대신에 내가 실행한 것입니다 compare_output.pl restart test.

그렇지 않으면 do_stuff여전히 오랫동안 실행됩니다.

그 외에도 파이프라인과 프로세스 대체에 대해 읽어봤는데 여기에 질문이 많은데 검색할 적절한 키워드가 부족한 것 같습니다.

알아요 쉘 루프를 사용하여 텍스트를 처리하는 것이 왜 나쁜 습관으로 간주됩니까? 그리고 제가 하는 방식은 나쁜 습관이지만 지금 당장은 바꿀 수 없는 상황이라는 점을 이해해 주세요.

그렇다면 죽은 후에 가능한 한 빨리 일이 일어나도록 하려면 어떻게 해야 합니까 compare_output.pl? (프로세스 실행이 중지되었으며 ps항목이 없습니다.)

이것이 실제로 작동하도록 하는 유일한 옵션이라면 루프를 완전히 다시 작성할 의향이 있습니다. 지금은 다른 스크립팅 언어를 사용하고 싶지 않지만 필요하다면 (어쨌든) 다시 작성할 수 있지만 perl그렇게 하고 싶지는 않습니다.

답변1

첫 번째 루프를 다른 루프로 파이프합니다.

while :; do ./do_stuff ; done | 
  while :; do ./compare_output.pl ; done

관련 정보