Как вы можете сказать, какие файлы в настоящее время открыты любым пользователем? - PullRequest
2 голосов
/ 31 мая 2011

Я пытаюсь написать скрипт или фрагмент кода для архивирования файлов, но я не хочу архивировать все, что открыто в данный момент.Мне нужно найти способ определить, какие файлы в каталоге открыты.Я хочу использовать Perl или сценарий оболочки, но при необходимости могу попробовать использовать другие языки.Это будет в среде Linux, и у меня нет возможности использовать lsof.У меня также были противоречивые результаты с термоэлементом.Спасибо за любую помощь.

Я пытаюсь взять файлы журналов в каталоге и переместить их в другой каталог.Однако, если файлы открыты, я не хочу ничего с ними делать.

Ответы [ 3 ]

3 голосов
/ 31 мая 2011

Вы неправильно подходите к проблеме.Вы хотите, чтобы файлы не изменялись под вами, пока вы читаете, и не можете сделать это без поддержки операционной системы.Лучшее, на что вы можете надеяться в многопользовательской системе, - это поддерживать согласованность метаданных архива.

Например, если вы создаете каталог архива, убедитесь, что количество байтов, хранящихся в архиве, соответствует каталогу.Вы можете проверить контрольную сумму содержимого файла до и после чтения файловой системы и сравнить ее с тем, что вы записали в архив, и, возможно, пометить ее как «несогласованную».

Что вы пытаетесь выполнить?

Добавлено в ответ на комментарий:

Посмотрите на logrotate, чтобы украсть идеи о том, как справиться с этим последовательно, просто сделайте это за вас.Если вы обеспокоены тем, что переименование файлов приведет к тому, что процессы, которые в настоящее время их записывают, будут ломать вещи, взгляните на man 2 rename:

rename () переименовывает файл, перемещая его между каталогами, если это необходимо,Любые другие жесткие ссылки на файл (созданные с помощью ссылки (2)) не затрагиваются.Открытые файловые дескрипторы для oldpath также не затрагиваются.

Если newpath уже существует, он будет атомарно заменен (при соблюдении нескольких условий; см. ОШИБКИ ниже), так что нет точки, в которой другой процесс пытается получить доступ к newpathнайдет его пропавшим без вести.

1 голос
/ 31 мая 2011

msw правильно ответил на вопрос, но если вы хотите подать список открытых процессов, команда lsof выдаст его вам.

1 голос
/ 31 мая 2011

Попробуйте ls -l /proc/*/fd/* как root.

...