如何通過 SSHFS 使用 inotify 或命名管道?
謝謝
sshfs
魔術,我可以從遠端伺服器掛載我的主目錄sshfs user@server:/home/user ~/remote
樂觀地說,我想我會設置一個本地
inotify
掛鉤~/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。它完全扼殺了抽象。
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
在伺服器上執行命令,在客戶端解析其輸出。您可以設置主連接,以便更快地打開從同一客戶端到同一伺服器的多個連接。