cronjob이 이전 rsync 작업이 완료 될 때까지 기다리게합니다.


11

rsync를 사용하여 한 서버에서 다른 서버로 일부 데이터를 백업하고 있습니다. 모두 잘 작동하지만 전송할 데이터 양에 따라 완료하는 데 시간이 더 걸릴 수 있습니다.

이전 명령이 cronjob 사용을 마치기 전에 rsync 명령이 시작되지 않도록하는 확실한 방법이 있습니까?

예를 들어, 매시간마다 rsync 명령을 실행하지만 전송이 완료되는 데 1 시간 이상이 소요될 수 있으므로 다음 명령은 이전 명령이 완료되기 전에 시작됩니다.


작업을 완료하는 데 잠재적으로 1 시간 이상이 걸리고 지속 시간보다 더 늦게 예약하는 경우 작업 일정이 잘못되었습니다. 시간을 줄이거 나 작업 간격을 늘리는 방법을 찾으십시오. 지속적으로 원격 백업을 수행하는 경우 새로운 재해 복구 계획을 고려할 수 있습니다.
vgoff

답변:


11

어떤 종류의 잠금을 구현할 수 있습니다. 그러면 여전히 실행중인 rsync 프로세스 수가 인쇄됩니다.

pgrep -cx rsync

그리고 다른 rsync 프로세스가없는 경우에만 rsync를 실행합니다.

pgrep -cx rsync || rsync ...

사용 -x우연히 일치 원치 않는 이름에서 방지 할 수 있습니다 (예 : "fooba을위한 rsync를 hronizator"또는 "not_an_ rsync를 _totally"- 그냥 같이 작동 pgrep -c ^rsync$)


분명하지 않은 경우. -c는 이름이 rsync 인 프로세스 수를 계산합니다. 이것이 0이 아닌 경우 쉘은 결과를 true (not false)로 해석합니다. || "또는 라인"은 첫 번째 항목이 참이고 두 번째 항목 인 rsync를 실행하는 것을 방해하지 않습니다.
rob

13

flock 명령을 사용 하여이 작업을 수행 flock -n할 수 있습니다. 예를 들어 잠금을 얻을 수없는 경우 명령이 즉시 실패 할 수 있으므로 원하는 경우 일 것입니다.

30 * * * *  /usr/bin/flock -n /tmp/myRsyncJob.lck /path/to/your/rsyncScript 

일반적으로 / tmp의 예측 가능한 파일 이름은 경쟁 조건 및 / tmp 디렉토리에 대한 광범위한 액세스로 인해 종종 위험합니다. 이 경우 안전합니까?
mc0e

이 경우 예측 가능한 이름은 안전 할뿐만 아니라 필요합니다. 그것이 자물쇠 (명사)를 자물쇠 (동사)로 만드는 것입니다. 다시 말해, 잠금 상태는 구체적이고 전적으로 예측 가능한 특정 이름을 가진 파일의 존재에 기초합니다. 파일 이름을 예측할 수 없거나 동적으로 변경된 경우 flock은 rsync가 자체적으로 실행되도록하여 목적을 무효화합니다. 그러나 /var/run대신 잠금 파일을 다른 곳에두면 걱정을 덜 수 있고 imo는 좀 더 "정확"할 수 있습니다 .
Evan de la Cruz

3

다른 도구를 고려하고 싶다면 rdiff-backup을 살펴보십시오 . librsync를 사용하여 백업을 수행하고 구성 가능한 델타 / 증분 수를 저장합니다. 또한 한 번에 하나의 rdiff-backup 프로세스 만 실행할 수 있도록 잠 깁니다.


rdiff-backup도 사용합니다. 그러나 rdiff-backup은 rsync 단독보다 완료하는 데 더 많은 시간이 걸리므로이 설정에서는주의해야합니다.
mgabriel

3

여기 내가 할 일이 있습니다. rsync 주위에 랩퍼 스크립트를 작성하여 잠금 파일을 작성하십시오.

script 1
- create lock file
- rsync
- remove lock file

script 2 (running later then script 1)
- check if lock file is there
    - if not run
    - if it is there wait 10 minutes in a loop. break out of lopp when the lock file is gone
- continue to run script

2
재부팅 후 잠금 파일도 제거해야합니다. 그렇지 않으면 다시 실행되지 않는 프로세스가 발생할 수 있습니다.
John Gardeniers

2

내 대답은 Mike가 말한 것과 다소 같습니다.

스크립트에서 다음과 같이 입력해야합니다.

  • 잠금 파일 생성
  • 다음에 실행할 때 잠금 파일이 있는지 확인하십시오.

그러나 당신이해야 할 매우 중요한 일이 있습니다. 트랩 시스템을 구현하는 것입니다.

그래서, 당신이 할 수있는 일은 어떻게 든 스크립트가 죽었거나 누군가가 그것을 죽였다하더라도 그 신호를 포착하고 잠금 파일을 제거하여 오래된 잠금 파일이 없다는 것입니다.

여기에서 그것을 구현하는 방법을 읽을 수 있습니다 .

단지 하나의 작은 일, 당신은 신호 9를 잡을 수 없습니다. 누군가가 그렇게한다면 kill -9, 그 신호가 커널과 직접 상호 작용하고 그것을 잡을 수있는 방법이 없기 때문에 그것을 잡을 수는 없습니다.

또한 John이 제안한대로 오래된 파일이 남아 있지 않도록 시스템을 재부팅 할 때마다 잠금 파일을 제거해야합니다.

rm -f <FILE>/etc/rc.local에 작은 명령을 넣어서 쉽게 할 수 있습니다


1

-s (직렬화) 스위치를 사용하여 anacron (비 정기적 cron)을 살펴보십시오. 직렬화는 이전 명령이 여전히 실행중인 경우 명령이 다시 호출되지 않도록합니다.


질문을 오해했을 수 있습니다.
John Gardeniers

나는 그렇게 생각하지 않습니다. 문제는 "이전 명령이 cronjob 사용을 마치기 전에 rsync 명령이 시작되지 않도록하는 확실한 방법이 있습니까?"입니다. Anacron은 추가 / 다른 기능으로 cronjob을 실행합니다. 직렬화는 호출 한 명령이 이전 명령이 완료 될 때까지 시작되지 않도록합니다.
tu-Reinstate Monica-dor du

사과드립니다. 질문을 잘못 읽은 것은 였습니다 .
John Gardeniers


0

pgrep의 OSX 버전에 -c 옵션이없는 것 같아서 OSX에서 작동하는 mgabriel의 솔루션을 얻을 수 없었습니다 (이것이 카운트라고 가정합니다). 대신 나는 다음을 사용했다.

[ $(pgrep ping | wc -l) -eq 0 ] && ping multiplay.co.uk || echo "Sorry, ping already in progress"

예제 명령으로 ping을 사용했습니다.

도움이 되었기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.