서버간의 실시간 동기화를 해야 하는데....
무작정 cron으로 rsync를 하기 보다는 inotify를 사용하여 동기화를 시도해보았다.
물론 이건 엄청난 단점을 가지고 있다.. ㅡㅡ;;
그건 알아서들 분산하거나 보완하기 바란다.
간단한 예제를 만들어 보았다.
소스는 간단하니... 뭐.. 설명할 게 없다.
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/inotify.h>
#define EVENT_SIZE ( sizeof (struct inotify_event) )
#define BUF_LEN ( 1024 * ( EVENT_SIZE + 16 ) )
int main( int argc, char **argv ) {
char target[20]; /* monitoring directory name */
int fd;
int wd; /* watch desc */
char buffer[BUF_LEN];
fd = inotify_init();
if (fd < 0) {
perror("inotify_init");
}
if (argc < 2) {
fprintf (stderr, "Watching\n");
strcpy (target, ".");
} else {
fprintf (stderr, "Watching '%s' directory\n", argv[1]);
strcpy (target, argv[1]);
}
wd = inotify_add_watch(fd, "/root/inotify", IN_MODIFY | IN_CREATE | IN_DELETE | IN_MOVED_FROM | IN_MOVED_TO | IN_MOVE_SELF | IN_CLOSE_WRITE);
while(1) {
int length, i = 0;
length = read(fd, buffer, BUF_LEN);
if (length < 0) {
perror("read");
}
while (i < length) {
struct inotify_event *event = (struct inotify_event *) &buffer[i];
printf ("[debug] wd=%d mask=%d cookie=%d len=%d dir=%s\n", event->wd, event->mask, event->cookie, event->len, (event->mask & IN_ISDIR)?"yes":"no");
if (event->len) {
switch (event->mask) {
case IN_CLOSE_WRITE:
if (event->mask & IN_ISDIR) {
printf("The directory %s was created[IN_CLOSE_WRITE].\n", event->name);
} else {
printf("The file %s was created[IN_CLOSE_WRITE].\n", event->name);
}
break;
case IN_CREATE:
if (event->mask & IN_ISDIR) {
printf("The directory %s was created[IN_ISDIR]\n", event->name);
} else {
printf("The file %s was created[IN_ISDIR].\n", event->name);
}
break;
case IN_DELETE:
if (event->mask & IN_ISDIR) {
printf("The directory %s was deleted[IN_DELETE].\n", event->name);
} else {
printf("The file %s was deleted[IN_DELETE].\n", event->name);
}
break;
case IN_MODIFY:
if (event->mask & IN_ISDIR) {
printf("The directory %s was modify[IN_MODIFY].\n", event->name);
} else {
printf("The file %s was modify[IN_MODIFY].\n", event->name);
}
break;
case IN_MOVED_FROM || IN_MOVED_TO || IN_MOVE_SELF:
if (event->mask & IN_ISDIR) {
printf("The directory %s was moved[MOVE].\n", event->name);
} else {
printf("The file %s was moved[MOVE].\n", event->name);
}
break;
}
}
i += EVENT_SIZE + event->len;
}
}
/*
inotify_rm_watch(fd, wd);
close(fd);
*/
return 0;
}
댓글 없음:
댓글 쓰기