Pergunta
Escrevi alguns sistemas de arquivos simples com Python-fuse, mas agora quero fazer algo que não consigo encontrar no pydoc nem nos scripts de amostra que encontrei: quando o sistema de arquivos é desmontado com fusermount -u
, Desejo interceptar essa ação, executar o umount e, em seguida, rmdir o diretório de montagem criado pelo script de inicialização do meu programa.Se for possível, qual é o encantamento mágico para prender a ação umount?
Eu posso ver como isso pode facilmente se transformar em um loop infinito, mas posso descobrir como desativar a armadilha do umount na primeira vez que for atingida.
Atualização: encontrei
destroy
em http://omake.metaprl.org/prerelease/omake-dll-fuse.html#htoc582 e adicionou o método, mas não parece ser chamado.
Solução
encontrou!é fsdestroy () em Python-fuse.localizado por:
jcomeau@intrepid:/usr/src/google-desktop/api$ cat /usr/lib/python2.6/dist-packages/fuseparts/* | strings | grep destroy fsdestroy
O que usei foi:
def fsdestroy(self, data = None): syslog.syslog(syslog.LOG_INFO, 'destroy %s: %s' % (self.mountpoint, data)) os.rmdir(self.mountpoint)
Não sei se o parâmetro de dados é necessário ou não, mas não faz mal.E, aparentemente, é chamado após o umount, então não precisei me preocupar em lidar com isso.
Outras dicas
Outra solução, embora não específica e não testada em Python, é impedir o FUSE de "daemonizar" com a opção -f
.
Nesse caso, o método fuse_main
irá bloquear até que o sistema de arquivos seja desmontado, e você receberá o controle de volta depois.
Se você precisa do comportamento deamon, pode reimplementá-lo antes de montar.