watch
명령을 사용하여 로컬 git 저장소에서 원격 지점의 변경 사항을 모니터링한 다음 작업을 실행하는 것을 목표로 BASH 스크립트를 작성하려고 합니다 .
스크립트가 호출 task.sh
되고 다음과 같다고 가정해 보겠습니다.
watch -n 3000 (git remote update && git status) | \
grep -i "your branch is behind origin/" && \
{ "pull changes, run tests, etc." ; }
내가 게시한 내용은 지금까지의 내용과 비슷하지만 마지막 부분이 제대로 작동하지 않는 것 같습니다. 즉, git 브랜치를 변경해도 시작되지 않는 것 같습니다. 출력을 watch
해당 파일로 리디렉션할 수 있지만 watch -n 3000 ls 1>> file.txt
이 방법을 사용하려면 파일을 열어야 하기 때문에 속도가 느리고 오류가 발생하기 쉽습니다.
기본적으로 스크립트를 시작한 스크립트가 종료될 때까지 계속 실행하고 싶습니다 . 하지만 그보다 더 좋은 방법이 watch
있다면 그것도 좋을 것입니다.watch
답변1
DopeGhoti가 언급했듯이 cron
이것이 더 나은 선택이 될 것입니다.
귀하의 예에는 이미 50분 간격이 있습니다. 간격을 1시간으로 설정하는 것이 허용된다면 많은 최신 배포판에는 /etc/cron.hourly
디렉토리가 있습니다. 실행 가능 비트가 설정된 해당 디렉토리의 모든 항목은 매시간 실행됩니다(내가 본 대부분의 구현에서는 run-parts
해당 디렉토리에서 파일 이름별로 선형적으로 실행되는 실행 파일을 사용합니다).
간격을 줄여야 한다면 를 추천합니다 /etc/cron.d
. cron 데몬은 일반적으로 이 디렉터리를 직접 구문 분석하므로 실행 가능 비트를 설정할 필요가 없습니다. task
다음 내용으로 파일을 생성할 수 있습니다 .
*/30 * * * * root /path/to/task.sh
처음 5개 필드는 분, 시간, 날짜, 월, 요일을 나타냅니다. 이 예에서는 분에 대해 30분 단계 값을 지정합니다. 따라서 이 특정 예제는 task.sh
30분마다, 매시간, 매월 매일 실행됩니다. 아이디어를 얻으실 수 있습니다.
30분을 초과하는 분 필드의 단계 값은 N
시간 후 분에 실행됩니다. 여기서 는 N
분 필드의 값입니다.
바라보다여기홀수 간격에 대한 솔루션입니다.
이제 bash 코드를 보면...
이것이 예상대로 작동하지 않는 이유는 grep
평가할 종료 값이 반환되지 않기 때문입니다 &&
. 여전히 grep
출력 중 입니다 watch
.
이는 아래 예에서 볼 수 있습니다. 중괄호 echo
안의 합계가 sleep
대체됩니다 watch
. sleep
종료 후에도 가능합니다 grep
. 두 번째 날짜는 종료가 완료될 때까지 실행되지 않으며 grep
종료 코드를 평가할 수 있습니다.
[vagrant@localhost ~]$ date +%s; { echo a; sleep 15; } | grep 'a' && date +%s
1493875975
a
1493875990
이 문제를 해결하는 한 가지 방법은 모든 것을 내부로 옮기는 것입니다 watch
.
watch -n 15 'bash -c "echo a | grep 'a' && date +%s"'
또 다른 옵션은 while-true-loop를 사용하는 것입니다.
[vagrant@localhost ~]$ while :; do echo a | grep 'a' && date +%s; sleep 15; done
a
1493875992
a
1493876007
a
1493876022
^C