最近使用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...