簡體   English   中英

掛載文件系統時使用Java api接收通知

[英]java api to receive notifications when a file system is mounted

我正在尋找一個Java API,該API將允許注冊文件系統安裝事件,即,在安裝或卸載文件系統時。 具體來說,我想知道可移動USB設備上的文件系統何時可用,並且還確切地知道它是什么類型的USB設備。

默認情況下,udev子系統會提供有關USB插入和拔出事件的通知,但不是專門提供設備上的文件系統可用時的通知。 可以創建udev規則來分段執行該規則,例如在添加和刪除設備時創建目錄並執行程序。 但是我對udev規則的經驗是,該語法是不可思議的,並且易碎且調試起來不容易。

我已經根據這篇文章安裝了usbmount:

https://serverfault.com/questions/414120/how-to-get-usb-devices-to-automount-in-ubuntu-12-04-server

盡管我相信設備默認情況下會自動啟動。

作為替代方案,我在/ media上構造了一個JDK 7 WatcherService,它可以檢測/ etc / mtab中的更改。 這行得通,但是我看到了某些USB設備上的文件系統仍未准備就緒的情況-這意味着即使在/ etc / mtab中進行了輸入,嘗試讀取目錄也會引發異常。 我添加了一個定時器,以可配置的毫秒數進入睡眠狀態,並且在大多數情況下,100ms的等待時間有效,但不是100%的時間。 這意味着增加這個等待時間不是絕對的保證,也不是確定的。

很顯然,由於顯示了Nautilus彈出窗口,因此正在生成較低級別的安裝事件。 我有一個閃存驅動器,它會將Nautilus圖標放在啟動板菜單中,但是直到單擊該圖標打開后才能安裝。

我還查看了以下選項:

  • 拖尾/ var / log / syslog; 這可能是下一個最佳選擇。 我看到如下行:

:Dec 2 08:58:07 fred-Inspiron-530 udisksd [1759]:代表uid 1000在/ media / fred / USB DISK1掛載了/ dev / sdk1

我將在此處嘗試使用WatcherService來查看是否存在相同的計時問題,即寫入此消息后目錄是否可讀。

  • jlibudev [github.com/nigelb/jlibudev]對udev子系統而言,Java API比編寫規則要好得多,但是它仍然不足,因為您仍然必須將許多不同的事件組合在一起。 注意:jlibudev依賴於JNA [ https://github.com/twall/jna]和purejavacomm [github.com/nyholku/purejavacomm、sparetimelabs.com/purejavacomm/purejavacomm.php],這兩種方法本身都很有用。

  • lsusb提供有關USB設備的詳細信息,但不提供有關其安裝位置的信息。

理想情況下,我想要一個簡單的API,該API允許使用標准Java事件偵聽模式注冊文件系統的掛載/卸載事件。 我想相信這樣的API存在或至少有可能,因為在宏觀層面上正在發生凈效應。 我仍在尋找JDK 7和JDK 8 API的其他選擇。

任何和所有的指示和協助將不勝感激。

由於沒有與操作系統無關的方式來處理掛載文件系統,因此絕對沒有JDK API。 我猜這個問題沒有解決很多(沒有很多程序直接處理掛載文件系統),因此不太可能有任何預構建的庫在等您。

在您提到的方法中,就它們特定於平台的方式而言,它們聽起來都大致相同(全部僅適用於Linux),因此,性能和易於編寫成為懸而未決的問題。 關於性能,每秒運行一次以上lsusb是(a)一個巨大的hack :-),並且(b)fork + exec比在進程中運行要慢,並且拖尾事件日志會創建很多(不可預測的)對與USB掛載無關的程序起作用,並使您的實現更加脆弱(升級操作系統時,如果消息字符串發生變化,該怎么辦?)。 關於編程的易用性,使用jna或JNI調用/media上的/media上的libudevWatcherService聽起來幾乎相等-使用libudev似乎是Linux發行版/用戶配置中最可移植的選項(我猜這就是Nautilus所使用的)。

但是,為了簡化實施,使其可為99%的用戶使用,很難做到/media上的WatcherService更好。 為幫助確保文件系統在使用前可用,我將使用帶有某種隨機指數退避的循環,以等待兩次嘗試讀取目錄之間的等待時間-這樣一來,您再也不會等待比等待時間更長的時間了。要掛載的文件系統,您不會消耗大量的CPU來喚醒和嘗試讀取,也不必選擇一個不會在任何地方都有效的超時編號。 如果您足夠小心以確保您不會永遠束縛單個線程的睡眠,那么我將使用ScheduledExecutorService發出嘗試訪問文件系統的Runnable ,如果不可用,則計划將自身再次運行一次,否則使用某種隊列通知您的主線程新文件系統可用。

編輯 :我剛剛了解到您還可以監視/proc/mounts文件的更新。 希望由於內核負責更新此文件,因此只有在完全裝入文件后,事情才會出現,盡管我不確定。 有關更多詳細信息, 如何解釋/ proc / mounts? Red Hat文檔很有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM