54 關於 Properties init: Could not determine current working directory

前言

昨天 偶然碰到了這樣的一個問題  

然後 昨天[04.18]標記了一下 今天看一下是怎麼回事 

呵呵 這裏記錄一下, 當然 根據這個 錯誤信息 可以搜索到 很多的文章, 講的也都是這個問題的出現方式 

我這裏的這個問題的出現方式 也是和大多數的文章的出現的情況是一樣的 

 

 

執行的命令以及上下文

master:15 jerry$ sudo java -cp /Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/sa-jdi.jar sun.jvm.hotspot.HSDB
Error occurred during initialization of VM
java.lang.Error: Properties init: Could not determine current working directory.
	at jdk.internal.util.SystemProps$Raw.platformProperties(java.base/Native Method)
	at jdk.internal.util.SystemProps$Raw.<init>(java.base/SystemProps.java:241)
	at jdk.internal.util.SystemProps.initProperties(java.base/SystemProps.java:54)
	at java.lang.System.initPhase1(java.base/System.java:1997)
master:15 jerry$ pwd
/private/var/folders/pw/lb8dvl7d6474r5plrnwtcp180000gn/T/blockmgr-4cf1304b-8085-4a0b-8ba2-434c04b55b75/15

當前路徑是在 "/private/var/folders/pw/lb8dvl7d6474r5plrnwtcp180000gn/T/blockmgr-4cf1304b-8085-4a0b-8ba2-434c04b55b75/15", spark 的 blockManager 管理的一個目錄 

 

然後跟了一下 代碼 

搜索日誌信息, 只發現這裏 有一處這樣的輸出, 可以看到是 getcwd 函數返回了 NULL, 然後 才拋出的這個的異常 

 

然後 搜索了一下 百度百科-getCwd  

#include <unistd.h>

char *getcwd(char *buf, size_t size);

作用:把當前目錄的絕對地址保存到 buf 中,buf 的大小爲 size。如果 size太小無法保存該地址,返回 NULL 並設置 errno 爲 ERANGE。可以採取令 buf 爲 NULL並使 size 爲0來使 getcwd 調用 malloc 動態給 buf 分配,但是這種情況要特別注意使用後釋放緩衝以防止內存泄漏。

程序例如果在程序運行的過程中,目錄被刪除(EINVAL錯誤)或者有關權限發生了變化(EACCESS錯誤),getcwd也可能會返回NULL。

這裏提到了 兩點, 一點是 可能 size 太小, 另外一點是 程序當前目錄被刪除 或者 權限發生了變化 

從上面的圖可以看出 buf 分配的是 MAXPATHLENGTH, 我這裏顯然路徑還不是那麼長, 所以 重點應該是 懷疑文件目錄本身有什麼情況 

 

 

測試 - 可能 size 太小

master:15 jerry$ mkdir -p /private/var/folders/pw/lb8dvl7d6474r5plrnwtcp180000gn/T/blockmgr-4cf1304b-8085-4a0b-8ba2-434c04b55b75/15
master:15 jerry$ cd /private/var/folders/pw/lb8dvl7d6474r5plrnwtcp180000gn/T/blockmgr-4cf1304b-8085-4a0b-8ba2-434c04b55b75/15
master:15 jerry$ sudo java -cp /Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/sa-jdi.jar sun.jvm.hotspot.HSDB
Password:
master:15 jerry$ 

呵呵 我重新創建了一個這個目錄, 然後 進入其中 執行啓動 HSDB 的命令, 發現是可以的, 因此 這裏和路徑長度的關係應該不大

 

 

測試 - 文件目錄被刪除

master:15 jerry$ mkdir -p /private/var/folders/pw/lb8dvl7d6474r5plrnwtcp180000gn/T/blockmgr-4cf1304b-8085-4a0b-8ba2-434c04b55b75/15
master:15 jerry$ cd /private/var/folders/pw/lb8dvl7d6474r5plrnwtcp180000gn/T/blockmgr-4cf1304b-8085-4a0b-8ba2-434c04b55b75/15
master:15 jerry$ rm -rf /private/var/folders/pw/lb8dvl7d6474r5plrnwtcp180000gn/T/blockmgr-4cf1304b-8085-4a0b-8ba2-434c04b55b75/15
master:15 jerry$ sudo java -cp /Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/sa-jdi.jar sun.jvm.hotspot.HSDB
Error occurred during initialization of VM
java.lang.Error: Properties init: Could not determine current working directory.
	at jdk.internal.util.SystemProps$Raw.platformProperties(java.base/Native Method)
	at jdk.internal.util.SystemProps$Raw.<init>(java.base/SystemProps.java:241)
	at jdk.internal.util.SystemProps.initProperties(java.base/SystemProps.java:54)
	at java.lang.System.initPhase1(java.base/System.java:1997)

master:15 jerry$ 

呵呵 問題復現出來了, 應該就是這個原因, 可能是 我再調試的時候 進入了這個目錄, 然後 窗口一直保留在這裏, 調試的程序之後刪掉了這個目錄, 然後 我再執行的 啓動HSDB 的命令, 然後就報錯了 

 

 

測試 - 文件目錄權限更新爲不可讀 

master:15 jerry$ mkdir -p /private/var/folders/pw/lb8dvl7d6474r5plrnwtcp180000gn/T/blockmgr-4cf1304b-8085-4a0b-8ba2-434c04b55b75/15
master:15 jerry$ cd /private/var/folders/pw/lb8dvl7d6474r5plrnwtcp180000gn/T/blockmgr-4cf1304b-8085-4a0b-8ba2-434c04b55b75/15
master:15 jerry$ ll /private/var/folders/pw/lb8dvl7d6474r5plrnwtcp180000gn/T/blockmgr-4cf1304b-8085-4a0b-8ba2-434c04b55b75/
total 0
drwxr-xr-x  2 jerry  staff  64 Apr 19 10:16 15
master:15 jerry$ chmod 311 /private/var/folders/pw/lb8dvl7d6474r5plrnwtcp180000gn/T/blockmgr-4cf1304b-8085-4a0b-8ba2-434c04b55b75/15
master:15 jerry$ ll /private/var/folders/pw/lb8dvl7d6474r5plrnwtcp180000gn/T/blockmgr-4cf1304b-8085-4a0b-8ba2-434c04b55b75/
total 0
d-wx--x--x  2 jerry  staff  64 Apr 19 10:16 15
master:15 jerry$ sudo java -cp /Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/sa-jdi.jar sun.jvm.hotspot.HSDB
master:15 jerry$ 

呵呵 程序能夠正常啓動, 可能是 getcwd 和 讀取的權限沒啥關係吧  

 

 

最後

因爲這個是在 System.java 初始化的階段拋出來的問題 

因此, 任何的 java 程序, 遇到這種情況 是都會 gg 的, 這裏以 java -version 爲例 

master:15 jerry$ mkdir -p /private/var/folders/pw/lb8dvl7d6474r5plrnwtcp180000gn/T/blockmgr-4cf1304b-8085-4a0b-8ba2-434c04b55b75/15
master:15 jerry$ cd /private/var/folders/pw/lb8dvl7d6474r5plrnwtcp180000gn/T/blockmgr-4cf1304b-8085-4a0b-8ba2-434c04b55b75/15
master:15 jerry$ rm -rf /private/var/folders/pw/lb8dvl7d6474r5plrnwtcp180000gn/T/blockmgr-4cf1304b-8085-4a0b-8ba2-434c04b55b75/15
master:15 jerry$ java -version
Error occurred during initialization of VM
java.lang.Error: Properties init: Could not determine current working directory.
	at java.lang.System.initProperties(Native Method)
	at java.lang.System.initializeSystemClass(System.java:1166)

master:15 jerry$ 

 

 

參考

百度百科-getCwd  

52 關於System.setProperty("user.dir", newUserDir);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章