谢谢sshfs
神奇的是,我可以从远程服务器挂载我的主目录
sshfs user@server:/home/user ~/remote
乐观地说,我想我应该设置一个本地inotify
-钩on ~/remote/logFile
(在sshfs
挂载中),以便本地程序可以对远程日志更改做出反应。
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
什么都没发生。inotifywait
除非我touch
在本地保存文件,否则是沉默的。写入命名管道同样会失败。
为什么是这样?
我怎样才能弥补这个差距?
我可以在远程运行inotifywait
,修改文件系统更改序列化策略并保持与本地的连接,但随后我基本上重新实现了 SSHFS。它完全消除了抽象。
答案1
SSHFS 文件系统构建在SFTP协议。 SFTP 只提供以“经典”方式操作文件的工具;客户端向服务器发出请求(列出目录、上传文件等),然后服务器响应。该协议中没有任何功能可以让服务器自发地通知客户端发生了某些事情。
这使得无法在 SSHFS 内提供 inotify 等功能。可以使用专有扩展来扩展 SSHFS,或者使用成熟的 SSH 连接来补充它;但我不知道 SSHFS 有任何此类扩展。
出于同样的原因,命名管道无法在 SSHFS 之上实现。 NFS,经典的网络文件系统,也没有任何支持跨机器命名管道的设施。在网络文件系统上,命名管道在安装它的每台计算机上(除了服务器之外)创建一个独立的通信点。
FAM(SGI IRIX 中的inotify 类似物已移植到Linux)提供了一个允许通过网络发送通知的守护进程。自从 inotify 出现以来,Linux 已经相当弃用 FAM,所以我不知道运行 FAM 是否比滚动您自己的特定于应用程序的通知系统更容易。您需要通过 SSH 设置一些端口转发或建立 VPN,以保护 FAM 和 NFS 的网络链接。
如果您选择自己部署,假设您同意为客户端提供 shell 访问权限,那么代表客户端运行 inotify 监视器相当容易:让客户端打开 SSH 连接,然后inotifywait
在服务器上运行命令,在客户端解析其输出。你可以设置主连接以便更快地打开从同一客户端到同一服务器的多个连接。