BASH 및 watch 명령을 사용하여 정기적인 작업 수행

BASH 및 watch 명령을 사용하여 정기적인 작업 수행

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.sh30분마다, 매시간, 매월 매일 실행됩니다. 아이디어를 얻으실 수 있습니다.

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

관련 정보