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.