프로세스를 종료하고 결과를 비교합니다.

프로세스를 종료하고 결과를 비교합니다.

나는 간단한 bash 스크립트를 작성하려고 시도했지만 제대로 작동하지 않습니다.

나는 원해요:

  • 프로그램을 시작하고 텍스트 파일의 입력을 제공합니다( ./prog < input1.txt).
  • 잠시 기다렸다가 키보드에 의해 방해받은 것처럼 종료합니다( & PID=$!; sleep 1; kill -INT $PID).원천
  • 프로그램 출력과 텍스트 파일의 차이점 찾기 ( | diff -y output1.txt -)원천

이것이 내가 지금 가지고 있는 것입니다. 이전 단계를 종합하면 다음과 같습니다.

./program < input1.txt & PID=$!; sleep 1; kill -INT $PID | diff -y output1.txt -

이 버전에서는 PID 줄이 숨겨져 있기 때문에 첫 번째 명령에 대한 출력이 항상 보고되지 않습니다. 프로그램 이름 뒤에 파일 리디렉션을 추가하면 이제 리디렉션을 가리키기 때문에 kill 명령이 작동을 멈춥니다.

bash --version편집: Ubuntu 16.04 를 사용하고 있습니다.GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)

답변1

실제로 코드 에서는 diff.killprogram()

스크립트의 또 다른 잠재적인 문제는 ;의 종료를 kill기다리도록 설계되지 않았다는 것입니다. program대신에 신호만 보냅니다. 따라서 diff전체 출력이 캡처되지 않은 채 경쟁 조건이 작동하는 것을 볼 수 있습니다 program. wait내장된 bash 백그라운드 프로세스가 종료될 때까지 프로그래밍 방식으로 기다리는 것이 좋습니다 .

위의 수정 사항이 포함된 코드 예제는 다음과 같습니다.

#!/bin/bash
(
    ./program <input1.txt &
    PID=$!
    sleep 1
    kill -INT $PID
    wait
) | diff -y reference_output.txt -

답변2

프로세스 대체[1]를 사용할 수 있습니다.

diff -y output1.txt <(your_program & sleep 1; kill $!)

1초 안에 많은 양의 데이터를 생성할 수 있는 경우 your_program(예: 기계를 yes(1)사용하여 비슷한 스크립트를 사용해 보십시오 .diffyesslowyeswhile echo y; do sleep .01; done

프로세스 <(...)교체가 실행 중입니다.평행하게따라서 diff데이터 처리를 시작하기 전에 완료될 때까지 기다리지 않습니다.

your_program잠시 후가 아니라 여러 행을 생성한 후 중지하는 것이 더 나을 것 같습니다.

diff -y output1.txt <(your_program | head -n 1000)

이 경우 일반적으로 파이프의 왼쪽에서 하는 것처럼 your_program제거해야 합니다 . SIGPIPE프로그램이 무시 SIGPIPE하고 write(2)오류가 발생하는 경우 이에 대한 또 다른 질문이나 수정 방법 또는 해결 방법을 문의하십시오.

[1] 쉘이 프로세스 대체를 지원하지 않는 경우( /bin/sh데비안과 같이 지원하지 않음 bash) 다른 답변에 표시된 것처럼 파이프를 사용할 수도 있습니다.

{ your_program & sleep 1; kill $!; } | diff -y output1.txt -

이 경우에도 동일한 주의 사항이 적용됩니다.

관련 정보