No Linux, parece que o tempo do sistema de arquivos está sempre alguns milissegundos atrás do tempo do sistema, levando a inconsistências se você quiser verificar se um arquivo foi modificado antes ou depois de um determinado tempo em intervalos de tempo muito estreitos (milissegundos).
Em qualquer sistema Linux com um sistema de arquivos que suporte resolução de nanossegundos (tentei com ext4 com inodes de 256 bytes e ZFS), se você tentar fazer algo como:
date +%H:%M:%S.%N; echo "hello" > test1; stat -c %y test1 | cut -d" " -f 2
o segundo valor de saída (hora de modificação do arquivo) está sempre alguns milissegundos atrás do primeiro (hora do sistema), por exemplo:
17:26:42.400823099
17:26:42.395348462
enquanto deveria ser o contrário, já que o arquivo test1
é modificado após chamar o date
comando.
Você pode obter o mesmo resultado em python:
import os, time
def test():
print(time.time())
with open("test1", "w") as f:
f.write("hello")
print(os.stat("test1").st_mtime)
test()
1698255477.3125281
1698255477.3070245
Por que é tão? E existe uma maneira de evitá-lo, para que a hora do sistema seja consistente com a hora do sistema de arquivos? A única solução alternativa que encontrei até agora é obter o "tempo" do sistema de arquivos (seja lá o que isso signifique na prática) criando um arquivo temporário fictício e obtendo seu horário de modificação, assim:
def get_filesystem_time():
"""
get the current filesystem time by creating a temporary file and getting
its modification time.
"""
with tempfile.NamedTemporaryFile() as f:
return os.stat(f.name).st_mtime
mas me pergunto se existe uma solução mais limpa.