近期在进行项目开发中,遇到需要使用java进行模型调用的接口封装,在进行Linux服务器模型计算调用中遇到难题,经过在网上查找资料,整理一篇跨平台调用运算的实现。
1、依赖添加
在pom.xml文件中添加ssh依赖:
<!-- 远程连接linux服务器工具 -->
<dependency>
<groupId>ch.ethz.ganymed</groupId>
<artifactId>ganymed-ssh2</artifactId>
<version>262</version>
</dependency>
2、整理代码
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
import org.springframework.util.ObjectUtils;
import java.io.*;
import java.util.Calendar;
public class SshUtil {
private static String DEFAULT_CHAR_SET = "UTF-8";
private static String tipStr = "=======================%s=======================";
private static String splitStr = "=====================================================";
/**
* 登录主机
* @return
* 登录成功返回true,否则返回false
*/
public static Connection login(String ip, String userName, String password){
boolean isAuthenticated = false;
Connection conn = null;
long startTime = Calendar.getInstance().getTimeInMillis();
try {
conn = new Connection(ip);
conn.connect(); // 连接主机
isAuthenticated = conn.authenticateWithPassword(userName, password); // 认证
if(isAuthenticated){
System.out.println(String.format(tipStr, "认证成功"));
} else {
System.out.println(String.format(tipStr, "认证失败"));
}
} catch (IOException e) {
System.err.println(String.format(tipStr, "登录失败"));
e.printStackTrace();
}
long endTime = Calendar.getInstance().getTimeInMillis();
System.out.println("登录用时: " + (endTime - startTime)/1000.0 + "s\n" + splitStr);
return conn;
}
/**
* 远程执行shell脚本或者命令
* @param cmd
* 即将执行的命令
* @return
* 命令执行完后返回的结果值
*/
public static String execute(Connection conn, String cmd){
String result = "";
Session session = null;
try {
if(conn != null){
session = conn.openSession(); // 打开一个会话
session.execCommand(cmd); // 执行命令
result = processStdout(session.getStdout(), DEFAULT_CHAR_SET);
//如果为得到标准输出为空,说明脚本执行出错了
if(ObjectUtils.isEmpty(result)){
System.err.println("【得到标准输出为空】\n执行的命令如下:\n" + cmd);
result = processStdout(session.getStderr(), DEFAULT_CHAR_SET);
}else{
System.out.println("【执行命令成功】\n执行的命令如下:\n" + cmd);
}
}
} catch (IOException e) {
System.err.println("【执行命令失败】\n执行的命令如下:\n" + cmd + "\n" + e.getMessage());
e.printStackTrace();
} finally {
if (conn != null) {
conn.close();
}
if (session != null) {
session.close();
}
}
return result;
}
/**
* 解析脚本执行返回的结果集
* @param in 输入流对象
* @param charset 编码
* @return
* 以纯文本的格式返回
*/
private static String processStdout(InputStream in, String charset){
InputStream stdout = new StreamGobbler(in);
StringBuffer buffer = new StringBuffer();
try {
BufferedReader br = new BufferedReader(new InputStreamReader(stdout, charset));
String line = null;
while((line = br.readLine()) != null){
buffer.append(line + "\n");
}
} catch (UnsupportedEncodingException e) {
System.err.println("解析脚本出错:" + e.getMessage());
e.printStackTrace();
} catch (IOException e) {
System.err.println("解析脚本出错:" + e.getMessage());
e.printStackTrace();
}
return buffer.toString();
}
public static void main(String[] args){
String ip = "服务器IP地址"; // 此处根据实际情况,换成自己需要访问的主机IP
String userName = "root";
String password = "Admin@123!";
Connection conn = SshUtil.login(ip, userName, password);
String cmd = "cd /home/w/modelTest/test2/src && export LD_LIBRARY_PATH=/usr/local/cuda/lib64/:$LD_LIBRARY_PATH && ./main";
String result = SshUtil.execute(conn, cmd);
System.out.println(splitStr + "\n执行的结果如下: \n" + result + splitStr);
}
}
3、问题整理
- 首先是进行远程登录连接时一直报错,无法进行ssh登陆问题:
sshd Key exchange was not finished, connection is closed.
经过查询参考,需要在服务器ssh配置文件中进行配置操作:
使用命令:sudo vim /etc/ssh/sshd_config,打开配置文件,在最后一行加入:
KexAlgorithms diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group-exchange-sha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group1-sha1,curve25519-sha256@libssh.org
保存文件后,使用命令重启ssh:service sshd restart即可生效。
- 在进行模型运算调用时,遇到无法找到jar包的问题:
然而模型在服务器中运行时可以正常查找到jar包:
经过反复试验,是因为在进行java远程调用中,服务器配置的LD_LIBRARY_PATH环境变量没有起作用,所在进行java远程调用时,加入了export命令:
export LD_LIBRARY_PATH=/usr/local/cuda/lib64/:$LD_LIBRARY_PATH
进行当前运行环境的配置,如此后就可以进行正常的模型运算了。
感谢:本文章参考了CSDN某一位大神的文章,由于链接找不到了,再次无法添加参考链接,再次感谢大神的文章给予的帮助。