天天看點

java linux指令遠端執行_java遠端調用linux的指令或者腳本

最近寫了一個docker微服務,此微服務需要在晚上12點時遠端觸發hadoop叢集的一個hive離線計算任務,是以需要 遠端調用linux shell

于是用到了ganymed-ssh2 這個庫

Maven裡的依賴如下:

ch.ethz.ganymed

ganymed-ssh2

build210

commons-lang

commons-lang

2.6

測試代碼如下:

packagesshtest;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.io.PrintWriter;importjava.io.UnsupportedEncodingException;importch.ethz.ssh2.ChannelCondition;importch.ethz.ssh2.Connection;importch.ethz.ssh2.Session;importch.ethz.ssh2.StreamGobbler;public classRemoteExecuteCommand

{//字元編碼預設是utf-8

private static String DEFAULTCHART = "UTF-8";privateConnection conn;privateString ip;privateString userName;privateString userPwd;publicRemoteExecuteCommand()

{this.ip = "172.27.8.132";this.userName = "root";this.userPwd = "123456";

}publicBoolean login()

{boolean flg = false;try{

conn= new Connection(ip);

conn.connect();

flg=conn.authenticateWithPassword(userName, userPwd);

}catch(IOException e)

{

e.printStackTrace();

}returnflg;

}publicString execute(String cmd)

{

String result= "";try{if(login())

{

System.out.println("hihiihihih2222:");

Session session=conn.openSession();session.requestPTY("bash");

session.startShell();

PrintWriter out= newPrintWriter(session.getStdin());

out.println(cmd);

out.flush();out.println("exit");out.close();

session.waitForCondition(ChannelCondition.CLOSED | ChannelCondition.EOF |ChannelCondition.EXIT_STATUS,60000);System.out.println("exec has finished!");

session.close();

conn.close();

}

}catch(

IOException e)

{

e.printStackTrace();

}returnresult;

}}

packagesshtest;

public classSshTest

{public static voidmain(String[] args)

{RemoteExecuteCommand rec= newRemoteExecuteCommand();

String result= rec.execute("sh /home/mongo-hive-hbase/Hive_HistClientsInfoAnalysis.sh");return;

}

}

參考:

http://www.cnblogs.com/-wangjiannan/p/3751330.html

http://www.programcreek.com/

BTW,用此庫調用shell腳本時,因為微服務不需要一直挂着等腳本,是以,需要用nohup的方式來讓shell腳本背景執行,這樣即使終端關閉也不會對執行有影響。

由于是docker服務,在布署docker的時候會起兩個docker 同時起,導緻到了12點會觸發執行兩次shell腳本,這個問題定位了兩天。。。。本地windows 下Eclipse試

着去觸發都好好的,布署到docker上就是會觸發兩次,于是,懷疑

1.ganymed ssh2庫接口的使用問題, 從session.execCommand(cmd) 這種調用方式換成了

session.requestPTY("bash");

session.startShell();

這種方式,還是一樣。

2. 懷疑windows /linux環境的不同所導緻 , 結果用以上sshtest的測試程式放在本地linux機器上試仍然ok

3. 懷疑是docker環境的問題,把以上sshtest打包成docker,在本地手動執行(本地環境隻會起一個docker),繼續ok

4.懷疑人生。。。。。

5. 最後絕望之前猛然發現docker get pods -o wide |grep xxx,發現有兩個在執行,把這事兒給忘記了。。

不過總歸是搞定了