J'observe les fichiers pour les changements en utilisant des événements inotify (en l'occurrence, depuis Python, en appelant dans libc).
Pour certains fichiers pendant un git clone
, je vois quelque chose d'étrange: je vois un IN_CREATE
événement, et je vois via ls
que le fichier a du contenu, cependant, je ne vois jamais IN_MODIFY
ou IN_CLOSE_WRITE
. Cela me pose des problèmes car j'aimerais répondre IN_CLOSE_WRITE
sur les fichiers: en particulier, pour lancer un téléchargement du contenu du fichier.
Les fichiers qui se comportent bizarrement se trouvent dans le .git/objects/pack
répertoire et se terminent par .pack
ou .idx
. Les autres fichiers créés par git ont une chaîne IN_CREATE
-> IN_MODIFY
-> plus régulière IN_CLOSE_WRITE
(je ne surveille pas les IN_OPEN
événements).
C'est à l'intérieur de Docker sur MacOS, mais j'ai vu des preuves de la même chose sur Docker sur Linux dans un système distant, donc je soupçonne que l'aspect MacOS n'est pas pertinent. Je vois cela si je regarde et je suis git clone
dans le même conteneur docker.
Mes questions:
Pourquoi ces événements manquent-ils dans ces fichiers?
Que peut-on y faire? Plus précisément, comment puis-je répondre à la fin des écritures dans ces fichiers? Remarque: idéalement, je voudrais répondre lorsque l'écriture est "terminée" pour éviter de télécharger inutilement / (incorrectement) une écriture "inachevée".
Edit: la lecture de https://developer.ibm.com/tutorials/l-inotify/ il ressemble à ce que je vois est cohérent avec
- un fichier temporaire distinct, avec un nom similaire
tmp_pack_hBV4Alz
, en cours de création, de modification et de fermeture; - un lien dur est créé vers ce fichier, avec le
.pack
nom final ; - le
tmp_pack_hBV4Alz
nom d' origine est supprimé.
Je pense que mon problème, qui essaie d'utiliser inotify comme déclencheur pour télécharger des fichiers, se réduit ensuite à remarquer que le .pack
fichier est un lien dur vers un autre fichier, et le téléchargement dans ce cas?