LINUX.ORG.RU

Слежение за изменениями в директории через inotify

 , ,


1

2

Есть проблема в реализации...
Некая программа(не знаю какая и как работает) пишет( и/или переписывает уже существующие) периодически в папку файлы типа *.tmp...
нужно при изменении или добавлении файлов копировать их в другую папку.
нашел inotify и inotify_add_watch & read.
отслеживает все, что происходит в папке(если файлы редактировать «вручную»)... супер!

НО вообще не реагирует на то, что делает(изменяет) та программа... может как то блокирует??

вообще не знаю что делать... какие есть еще методы, способы? желательно через плюсы.

void notifier(const char *dirname) {
    int fd, wd;
    char buf[BUFLEN];
    ssize_t i, len;
    struct inotify_event *event;
    if( (fd = inotify_init()) < 0) {
        perror("inotify_init:");
        exit(-1);
    }
    wd = inotify_add_watch(fd, dirname,
                           IN_MODIFY | IN_ATTRIB |
                           IN_CREATE | IN_DELETE);
    if(wd < 0) {
        perror("inotify_add_watch");
        exit(-1);
    }
    while(1) {
        i = 0;
        string file;
        size_t found;
        len = read(fd, buf, BUFLEN);
        while(i < len) {
            event = (struct inotify_event *) &buf[i];
            file =string(event->name);
            found=file.rfind(".tmp");
            if (found >0) { if (strevent(event->mask)==2)
                {sleep(1);
                copyFile(file.erase(file.length()-4));}
            }
            i += sizeof(struct inotify_event) + event->len;
        }
    }
}

Ответ на: комментарий от fornlr

редактировать, копировать, удалять эти файлы вручную права есть

rgB ()
Ответ на: комментарий от rgB

другая программа от рута запущена, наверно, а твоя нет

DELIRIUM ☆☆☆☆☆ ()

у тебя IN_MODIFY на директорию. Чтобы мониторить изменения в файле, вешай монитор на файл

yoghurt ★★★★★ ()
Ответ на: комментарий от yoghurt

Дык оно у ТСа отслеживает изменения в файле, когда они сделаны ручками из-под того же юзера. Так что мимо.

DELIRIUM ☆☆☆☆☆ ()

Ещё есть IN_MOVE и можно редактировать файл по хардлинку из другого места. Можно подцепить strace и посмотреть как загадочная программа меняет файлы в директории.

mashina ★★★★★ ()
Ответ на: комментарий от mashina

Какой strace, если ТС не знает, что за программа там херачится?

Некая программа(не знаю какая и как работает)

Кстати, это можно понять по lsof (проще), или по systemtap (изящнее).

DELIRIUM ☆☆☆☆☆ ()
Ответ на: комментарий от mashina

И ещё нужно читать внимательнее мануал, вот что ещё может быть плохого

The inotify API does not report file accesses and modifications that may occur because of mmap(2), msync(2), and munmap(2).

mashina ★★★★★ ()
Ответ на: комментарий от mashina

Тогда, конечно strace'ом можно посмотреть, что происходит.

DELIRIUM ☆☆☆☆☆ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.