Не знаю, как решить проблему с оболочкой, но (предполагая, что Linux 1
) inotify
может стать способом ... посмотрите на этот пример, имитирующийtail -F
(использующий pyinotify
), может быть, его можно использовать как основу для следования целому каталогу .
В общем, inotify
можно отслеживать каталоги (цитируя man 7 inotify
)
Следующие биты могут быть указаны в маске при вызове inotify_add_watch (2) и могут быть возвращены в поле маски, возвращаемом read (2):
IN_ACCESS File was accessed (read) (*).
IN_ATTRIB Metadata changed, e.g., permissions, timestamps,
extended attributes, link count (since Linux 2.6.25),
UID, GID, etc. (*).
IN_CLOSE_WRITE File opened for writing was closed (*).
IN_CLOSE_NOWRITE File not opened for writing was closed (*).
IN_CREATE File/directory created in watched directory (*).
IN_DELETE File/directory deleted from watched directory (*).
IN_DELETE_SELF Watched file/directory was itself deleted.
IN_MODIFY File was modified (*).
IN_MOVE_SELF Watched file/directory was itself moved.
IN_MOVED_FROM File moved out of watched directory (*).
IN_MOVED_TO File moved into watched directory (*).
IN_OPEN File was opened (*).
При мониторинге каталога события, отмеченные звездочкой (*) выше, могут происходить для файлов в каталоге, и в этом случае поле имени в возвращенной структуре inotify_event идентифицирует имя файла в каталоге.
(... и pyinotify
внимательно следит за этими вариантами)
1
У BSD есть похожая вещь kqueue
. Возможно, кросс-платформенное решение достижимо, используя GIO ( привязки Python ) в качестве уровня абстракции, так как оно может, кроме того inotify
, использоватьkqueue