2013-02-04 197 views
1

我正在使用Runtime.getRuntime().exec(cmd)來啓動PostgreSQL服務器。當使用上述命令啓動服務器時,我看到除了Runtime.getRuntime().exec()進程之外,正在創建新進程以啓動進程。Java將參數傳遞給子進程

john 14330 0.0 0.0 128244 2568 pts/88 S+ 19:35 0:00 pg_ctl -D /u/john/postgre_test/data/ start -w 
john 14334 9.5 0.0 124592 3736 pts/88 S+ 19:35 0:00 /usr/bin/postgres -D /u/john/postgre_test/data 

正如您所看到的,第一個是由於exec()方法創建的,而第二個也是創建的。現在,因爲服務器需要傳遞SSL私鑰密碼。如果我通過它使用

PrintStream ps = new PrintStream(process.getOutputStream()); 
    ps.println(keyPassword); 
    ps.flush(); 

我想這不是設置爲預期的過程,所以服務器沒有開始。我如何將參數傳遞給最近創建的進程?還是有其他方法可以使它工作嗎?請幫助我。任何幫助或建議將非常感激。

+0

so process是Runtime.getRuntime()。exec(cmd)返回的對象? –

+0

當您創建進程時,可能會有命令行參數構建到字符串的末尾。你將如何編寫一個'單行'從控制檯提示符啓動服務器? – DomV

回答

2

你在做什麼不是傳遞參數,而是寫入進程STDIN。

要將參數傳遞給進程,請使用Runtime.getRuntime().exec(String[] command);數組的第一個位置是命令,其餘的是參數。

+0

Runtime.getRuntime()。exec(cmd)中的字符串「cmd」是一個字符串數組。 String cmd [] = {「/ usr/bin/pg_ctl」,「-D」,「/ u/john/postgre_test/data /」,「restart」,「-w」}; – Mojoy

+0

你會在shell中使用的命令行是什麼?這將有助於澄清這個問題。 – SJuan76

+0

pg_ctl -D〜/ postgre_test/data/restart -w - 這是我用來在命令行中執行的命令。 – Mojoy