![](/img/trans.png)
[英]How to pause process run using Java's ProcessBuilder.start()?
[英]Using Java ProcessBuilder, how do I run a process located in a unix home directory?
我們有一個 Java 服務器-客戶端應用程序,它允許我們在不同的機器(即客戶端)上運行進程,這些進程由 Java ProcessBuilder
啟動。 我想運行一個進程,該進程將被復制/同步到用戶的主目錄(即啟動客戶端的用戶)。
如何在傳遞給ProcessBuilder
的String
中引用 unix 主目錄? (由於服務器-客戶端應用程序的設計,只有進程的字符串、參數等被傳遞給 ProcessBuilder。)
如果我明確說明主目錄,它會起作用:
/home/user/processes/process.sh
但是,這假設我知道哪個用戶正在運行客戶端。 (設計的一部分是我們可以切換/替換盒子/客戶端來運行作業,而不必知道誰在給定的盒子上啟動了客戶端。)
我也試過,但無濟於事:
$HOME/processes/process.sh
~/processes/process.sh
問題是 ~ 和 $HOME 只能被你的 shell 理解,可能是 BASH,而不是 ProcessBuilder 或 Java。
$HOME 應該可以通過屬性user.home
。 請參閱系統屬性文檔
String home = System.getProperty("user.home");
IE
File fullpath = new File(System.getProperty("user.home"), "processes/process.sh");
ProcessBuilder processBuilder = new ProcessBuilder(fullpath.getAbsolutePath());
或者可以相對於當前目錄調用它
ProcessBuilder processBuilder = new ProcessBuilder("processes/process.sh");
processBuilder.directory(new File(System.getProperty("user.home")));
最后,我采用的方法是將腳本及其參數傳遞給 bash - 沿着以下幾行:
ProcessBuilder pb = new ProcessBuilder("/bin/bash", "-c", "$HOME/processes/process.sh args");
自己沒有嘗試過,但應該可以:
改成home之前然后執行process.sh
cd && ./processes/process.sh
在命令行中, $HOME
和~
都被 shell 擴展到用戶的主目錄。
ProcessBuilder
在沒有外殼的情況下直接運行進程,因此這些擴展將不起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.