rsync를 사용하여 한 서버에서 다른 서버로 일부 데이터를 백업하고 있습니다. 모두 잘 작동하지만 전송할 데이터 양에 따라 완료하는 데 시간이 더 걸릴 수 있습니다.
이전 명령이 cronjob 사용을 마치기 전에 rsync 명령이 시작되지 않도록하는 확실한 방법이 있습니까?
예를 들어, 매시간마다 rsync 명령을 실행하지만 전송이 완료되는 데 1 시간 이상이 소요될 수 있으므로 다음 명령은 이전 명령이 완료되기 전에 시작됩니다.
rsync를 사용하여 한 서버에서 다른 서버로 일부 데이터를 백업하고 있습니다. 모두 잘 작동하지만 전송할 데이터 양에 따라 완료하는 데 시간이 더 걸릴 수 있습니다.
이전 명령이 cronjob 사용을 마치기 전에 rsync 명령이 시작되지 않도록하는 확실한 방법이 있습니까?
예를 들어, 매시간마다 rsync 명령을 실행하지만 전송이 완료되는 데 1 시간 이상이 소요될 수 있으므로 다음 명령은 이전 명령이 완료되기 전에 시작됩니다.
답변:
어떤 종류의 잠금을 구현할 수 있습니다. 그러면 여전히 실행중인 rsync 프로세스 수가 인쇄됩니다.
pgrep -cx rsync
그리고 다른 rsync 프로세스가없는 경우에만 rsync를 실행합니다.
pgrep -cx rsync || rsync ...
사용 -x
우연히 일치 원치 않는 이름에서 방지 할 수 있습니다 (예 : "fooba을위한 rsync를 hronizator"또는 "not_an_ rsync를 _totally"- 그냥 같이 작동 pgrep -c ^rsync$
)
flock 명령을 사용 하여이 작업을 수행 flock -n
할 수 있습니다. 예를 들어 잠금을 얻을 수없는 경우 명령이 즉시 실패 할 수 있으므로 원하는 경우 일 것입니다.
30 * * * * /usr/bin/flock -n /tmp/myRsyncJob.lck /path/to/your/rsyncScript
/var/run
대신 잠금 파일을 다른 곳에두면 걱정을 덜 수 있고 imo는 좀 더 "정확"할 수 있습니다 .
다른 도구를 고려하고 싶다면 rdiff-backup을 살펴보십시오 . librsync를 사용하여 백업을 수행하고 구성 가능한 델타 / 증분 수를 저장합니다. 또한 한 번에 하나의 rdiff-backup 프로세스 만 실행할 수 있도록 잠 깁니다.
여기 내가 할 일이 있습니다. 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
내 대답은 Mike가 말한 것과 다소 같습니다.
스크립트에서 다음과 같이 입력해야합니다.
그러나 당신이해야 할 매우 중요한 일이 있습니다. 트랩 시스템을 구현하는 것입니다.
그래서, 당신이 할 수있는 일은 어떻게 든 스크립트가 죽었거나 누군가가 그것을 죽였다하더라도 그 신호를 포착하고 잠금 파일을 제거하여 오래된 잠금 파일이 없다는 것입니다.
여기에서 그것을 구현하는 방법을 읽을 수 있습니다 .
단지 하나의 작은 일, 당신은 신호 9를 잡을 수 없습니다. 누군가가 그렇게한다면 kill -9
, 그 신호가 커널과 직접 상호 작용하고 그것을 잡을 수있는 방법이 없기 때문에 그것을 잡을 수는 없습니다.
또한 John이 제안한대로 오래된 파일이 남아 있지 않도록 시스템을 재부팅 할 때마다 잠금 파일을 제거해야합니다.
rm -f <FILE>
/etc/rc.local에 작은 명령을 넣어서 쉽게 할 수 있습니다
-s (직렬화) 스위치를 사용하여 anacron (비 정기적 cron)을 살펴보십시오. 직렬화는 이전 명령이 여전히 실행중인 경우 명령이 다시 호출되지 않도록합니다.
hatools ( http://www.fatalmind.com/software/hatools/ )를 사용 하여 대기 모드에서 rsync cron을 잠그십시오.
flock(1)