Graças à sshfs
magia, posso montar meu diretório pessoal a partir de um servidor remoto com
sshfs user@server:/home/user ~/remote
Otimista, eu pensei que eu ia definir um local de inotify
-Gancho em ~/remote/logFile
(na sshfs
montagem) para um programa local pode reagir a mudanças de log remotos.
cd ~/remote
touch logFile # create remote file
inotifywait logFile & # set up local inotify-hook
ssh user@server -x touch /home/user/logFile # touch file from remote
Nada acontece . inotifywait
fica em silêncio, a menos que eu touch
o arquivo localmente. A gravação em um pipe nomeado falha da mesma forma.
Por que é isso?
Como posso preencher essa lacuna?
Eu poderia rodar inotifywait
no controle remoto, hackear uma estratégia de serialização de alterações no sistema de arquivos e manter uma conexão com o local, mas basicamente estou reimplementando o SSHFS . E isso mata completamente a abstração.
inotify
de o sistema local detectar alterações em um sistema de arquivos remoto. O kernel local está fora do circuito nessas mudanças. Você precisa executarinotifywait
no servidor, não no cliente.Respostas:
O sistema de arquivos SSHFS é construído sobre o protocolo SFTP . O SFTP fornece apenas recursos para manipular arquivos de maneira "clássica"; o cliente faz uma solicitação ao servidor (lista um diretório, upload de um arquivo etc.) e o servidor responde. Não há nenhum recurso neste protocolo para o servidor notificar espontaneamente o cliente que algo aconteceu.
Isso torna impossível fornecer um recurso, como inotificar dentro do SSHFS. Seria possível estender o SSHFS com extensões proprietárias ou complementá-lo com uma conexão SSH completa; mas não conheço essa extensão do SSHFS.
Os pipes nomeados não podem ser implementados no SSHFS pelo mesmo motivo. O NFS, o sistema de arquivos em rede clássico, também não possui nenhum recurso para suportar máquinas cruzadas denominadas pipes. Em um sistema de arquivos em rede, um pipe nomeado cria um ponto de comunicação independente em cada uma das máquinas em que está montado (além do servidor).
O FAM (o analógico inotify no SGI IRIX, que foi portado para Linux) fornece um daemon que permite o envio de notificações pela rede. O Linux depreciou a FAM desde que o inotify entrou em cena, então não sei se conseguir executar a FAM seria mais fácil do que lançar seu próprio sistema de notificação específico do aplicativo. Você precisaria configurar algum encaminhamento de porta pelo SSH ou estabelecer uma VPN para proteger o link de rede para FAM e NFS.
Se você optar por fazer o seu próprio, assumindo que está bem em fornecer acesso ao shell dos clientes, é bastante fácil executar um monitor inotify em nome de um cliente: faça com que o cliente abra uma conexão SSH e execute o
inotifywait
comando no servidor , analisando sua saída no cliente. Você pode configurar uma conexão principal para acelerar a abertura de várias conexões do mesmo cliente para o mesmo servidor.fonte