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