我正在尝试使用JSch连接到远程计算机。我的所有系统都在 ubuntu 上运行,包括我的生产机器。我能够成功连接并运行jar文件。但是当我关闭窗口时,程序会自动关闭。我现在想要实现的是在后台运行这个jar文件。
我已经使用' & '添加了sudo命令。在这种情况下,服务器甚至无法启动。我尝试过使用shell频道,但服务器在停止我的程序时没有启动或关闭。
我还尝试了 nohup 和不公开命令在后台运行。当我使用 ps ux 获取进程状态时,STAT列显示T,根据this表示进程已停止。我已经在这里坚持了3天。
我正在使用以下版本的JSch:
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.53</version>
</dependency>
我使用以下代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
public class App extends Application {
@Override
public void start(Stage primaryStage) {
Button btn = new Button();
btn.setText("click");
btn.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent arg0) {
try {
JSch objJSch = new JSch();
Session objSession;
objSession = objJSch.getSession("userName", "host");
objSession.setPassword("password");
objSession.setConfig("StrictHostKeyChecking", "no");
System.out.println("Establishing Connection...");
objSession.connect();
System.out.println("Connection established.");
Channel objChannel = objSession.openChannel("exec");
((ChannelExec) objChannel).setCommand("cd {{path to my jar file}};sudo java -jar start.jar");
((ChannelExec) objChannel).setErrStream(System.err);
((ChannelExec) objChannel).setPty(true);//why should i use this??
InputStream in = objChannel.getInputStream();
OutputStream out = objChannel.getOutputStream();
objChannel.connect();
out.write(("password" + "\n").getBytes());
out.flush();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String s;
while ((s = br.readLine()) != null) {
System.out.println(s);
}
while (!objChannel.isClosed()) {
System.out.println("Waiting to close channel");
}
System.out.println("disconnecting...");
objChannel.disconnect();
objSession.disconnect();
System.out.println("disconnected.");
} catch (JSchException e) {
if (e.getMessage().equalsIgnoreCase("Auth fail"))
System.out.println("Authorization failed...");
else
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
StackPane root = new StackPane();
root.getChildren().add(btn);
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
答案 0 :(得分:1)
Your Code
((ChannelExec) objChannel).setCommand("cd {{path to my jar file}};sudo java -jar start.jar");
Modify it to :
((ChannelExec) objChannel).setCommand("cd {{path to my jar file}};sudo java -jar start.jar > /dev/null 2>&1 &");
这将解决您的问题。