記錄乙個使用ProcessBuilder踩到的坑

2021-10-01 03:18:33 字數 1479 閱讀 4120

最近使用processbuilder執行命令,命令內容正確,但始終報錯命令實行失敗,是因為不熟悉processbuilder用法踩到了坑,記錄一下。

先看一下我模擬出來的錯誤

要執行的命令:cp -rf /tmp/monkey/a.log /home/monkey/簡單的cp命令拷貝乙個檔案,卻報錯說檔案不存在。確認過檔案確實存在該目錄下。

檢視jdk 中,我使用的processbuilder(***) 原始碼實現如下,並不是乙個單獨的字串string形式,而是支援多個字串,同時還有list集合方式。

於是想到會不會是processbuilderbuilder不支援包含空格的命令。

動手寫了下面的**進行測試

public

class

processbuilderdemo

else

}/**

* 執行命令,命令用拼接成乙個字串形式(會包含空格)

* @param src 源路徑

* @param tag 目標路徑

*/private

static

void

cmdisstring

(string src, string tag)

catch

(exception e)

}/**

* 執行命令,命令各個部分拼接成乙個陣列或者arraylist集合

* 該方法採用陣列實現

* @param src 源路徑

* @param tag 目標路徑

*/private

static

void

cmdislistorarray

(string src, string tag)

; processbuilder builder =

newprocessbuilder

(cmds)

;try

catch

(exception e)

}}

果然如我所猜想的一樣:包含有空格的命令執行會報錯。

以下是cmdislistorarray方法,將命令的內容組成字串的形式執行的結果,而文章第一張圖則是直接當做一條完整命令的執行結果。

至於為什麼不能好有空格暫時未做深入了解,有帶佬可以釋疑嗎?難道一條完整的命令當做乙個字串它不香嘛?

while

(true

)

記錄乙個statck overflow

工作中遇到一次這樣的問題 棧上的空間不夠用了,導致stack overflow,程式crash,並且coredump被寫亂了。這裡用小例子,記錄這樣的問題。include include include include define stack buffer size 10240 void thre...

記錄乙個BUG

vm版本 kali版本 centos 8 版本 vmtool版本 新裝的centos8 因為無法拖拽檔案到虛擬機器中,就重新裝了一下vmtool,安裝之後還是不行,開啟kali發現原本裝好的vmtool,現在也不能拖拽檔案了,就又在kali重灌了一次,還是不能拖拽,上網查了一下,在執行.vmware...

記錄乙個 lll lock wait

乙個dba同事昨天在執行乙個命令列工具的時候發現程式hang住,問題挺有意思,值得記錄下。首先用pstack看了下程式的呼叫棧,這是個多執行緒程式,pstack結果看到幾乎所有的執行緒都等在write呼叫上。如下是pt pmp的輸出結果 tue may 27 18 30 06 cst 2014 55...