Κοιτώντας λίγο την λειτουργία του PIrsyncD (Python Inotify Rsync Daemon) διαπίστωσα το εξής πρόβλημα:
Όταν στον πηγαίο κατάλογο γράφονται πάρα πολλά αρχεία κατά την διάρκεια που εκτελεί το rsync process, τότε δημιουργούνται πάρα πολλά rsync threads με αποτέλεσμα να αυξάνει το process and memory usage. Το πρόβλημα αυξάνει όταν το synchronization των καταλόγων γίνεται μέσω δικτύου.
Για να αποφύγω τέτοια προβλήματα σκέφτηκα να δημιουργήσω προσωρινά ένα lockfile το οποίο θα λειτουργεί ως ασπίδα προστασίας. Εάν υπάρχει σημαίνει ότι ακόμα εκτελείτε προηγούμενο rsync proccess. Μόλις ολοκληρωθεί το rsync process διαγράφεται και το temporarily lockfile.
Μπορείτε να κατεβάσετε το πρόγραμμα από εδώ: PIrsyncD_20090713
Παραθέτω τον κώδικα:
#!/usr/bin/env python
# Python Inotify Rsync Daemon
# Evaggelos Balaskas, ebalaskas AT ebalaskas DOT gr
# Last change: Mon Jul 13 12:01:31 EEST 2009
import pyinotify,os
source_path = "/tmp/data/"
dest_path = "/tmp/data2/"
# Variables for rsync to a remote server
dest_server = ""
#dest_server = "server:"
rsync_ssh = ""
# rsync_ssh = "-e ssh"
rsync_path = "/usr/bin/rsync"
rsync_args = "-az --delete"
rsync_command = rsync_path + " " + rsync_args + " " + source_path + " " + rsync_ssh + " " + dest_server + dest_path
# LockFile - failsafe mechanism
lockfile = "/tmp/.PIrsync.lock"
wm = pyinotify.WatchManager()
mask = pyinotify.IN_CLOSE_WRITE
class PTmp(pyinotify.ProcessEvent):
def process_IN_CLOSE_WRITE(self, event):
if not os.path.exists(lockfile):
fd = os.open(lockfile, os.O_RDWR|os.O_EXCL|os.O_CREAT)
os.system(rsync_command)
os.remove(lockfile)
p = PTmp()
notifier = pyinotify.Notifier(wm, p)
wm.add_watch(source_path, mask, rec=True)
notifier.loop(daemonize=True, pid_file='/tmp/PIrsyncD.pid')