명령을 호출하고 기다린 후 다른 명령을 실행하세요.

명령을 호출하고 기다린 후 다른 명령을 실행하세요.

이것은 스트림(표준 입력)을 관찰하고 라인이 들어오면 잠시 기다렸다가 명령을 실행하고 좀 더 기다려야 하는 상황처럼 느껴집니다.

pyinotify 또는 fswatch와 같은 도구를 사용하여 폴더의 변경 사항을 모니터링하고 발견되면 다시 에코할 수 있습니다.

fswatch --recursive --latency 2 src/ | xargs make build

또는

pyinotify -r -a -e IN_CLOSE_WRITE -c 'make build' src/

make build제 경우에는 파일이 변경되었을 때 어떻게 호출할지 궁리 중입니다 . 위의 도구는 작동하지만 make build빠르게 연속해서 여러 번 호출될 수 있습니다. 각 도구는 조금씩 다르게 작동하지만 최종 결과는 동일합니다(make가 너무 많이 호출됨).

모든 스핀을 멈추고, 1초를 통과한 다음 한 번 호출되도록 해야 합니다.

명령을 일괄 처리한 다음 make를 호출하는 유닉스 방식이 있습니까? 이 같은:

fswatch --recursive src/ | aggregate_and_wait --delay 1second | make build

답변1

카나리아(변경 사항을 찾는 프로세스)가 /var/run/build-needed예 를 들어 상태 파일에 쓰도록 하세요.

자동 빌드 스크립트를 1분마다(또는 5분마다 또는 사용 사례에 적합하다고 생각하는 빈도) 실행하도록 크론 작업을 설정하면 다음이 수행됩니다.

  • 확인하고 /var/run/build-needed최신이 아니면 /var/run/last-build중단하세요.
  • 존재하는지 확인 /var/run/build-in-progress하고 존재하면 중단하십시오.
  • 만들다/var/run/build/in-progress
  • 빌드를 실행합니다.
  • 삭제 /var/run/in-progress하고 touch /var/run/last-build.

프레임워크 구현 예:

카나리아 프로세스:

pyinotify -r -a -e IN_CLOSE_WRITE -c 'touch /var/run/build-needed' src/

일하다 cron:

*/5 * * * * /path/to/autobuilder.sh

빌더 스크립트:

#!/bin/bash
canaryfile="/var/run/build-needed"
lastbuild="/var/run/last-build"
inprogress="/var/run/build-in-progress"
needbuild="no"
if [[ -f "$canaryfile" ]]; then
    if [[ -f "$lastbuild" ]] && [[ "$canaryfile" -nt "$lastbuild" ]]; then
        needbuild="yes"
    elif ! [[ -f "$lastbuild" ]]; then
        needbuild="yes"
    fi
fi
if ! [[ -f "$inprogress" && "yes" == "$needbuild" ]]; then
    cd /path/to/src
    touch "$inprogress"
    if make build; then
        rm "$inprogress"
        touch "$lastbuild"
    fi
fi

관련 정보