使用组合tail命令运行远程jar的Jsch无法正常工作

时间:2017-07-27 13:55:56

标签: linux spring-boot jsch

我试图通过SSH与SSH在远程linux服务器(在不同的端口上)运行一些独立的spring boot jar。我在命令上使用tail,因为我需要tomcat服务器日志。当我启动运行独立jar的服务时,一些罐子没有运行。

以下是我用来运行独立jar的示例脚本:

nohup java -jar foo.jar --server.port = 10000> log.txt 2> errors.txt& tail -f log.txt

这是我的代码:

StringBuilder sb = new StringBuilder();
Session session = null;
ChannelExec channel = null;
InputStreamReader isr = null;
BufferedReader br = null;
try {
    String command1 = "nohup java -jar " + jarFileDir + "/" + jarFileName + " --server.port=" + port
            + " > " + jarFileDir + "/log.txt 2> " + jarFileDir + "/errors.txt & tail -f " + jarFileDir + "/log.txt";

    java.util.Properties config = new java.util.Properties();
    config.put("StrictHostKeyChecking", "no");
    JSch jsch = new JSch();
    session = jsch.getSession(username, ip, port);
    session.setPassword(password);
    session.setConfig(config);
    session.connect();

    channel = (ChannelExec)session.openChannel("exec");
    channel.setPty(true);
    isr = new InputStreamReader(channel.getInputStream());
    br = new BufferedReader(isr);
    channel.setCommand(command1);
    channel.connect();

    String msg;
    while ((msg = br.readLine()) != null) {
        //jar logs is being readed and processed here
    }

} catch (Exception e) {
    //handle exception
} finally {
    //close all the connections
    if (br != null) br.close();
    if (isr != null) isr.close();
    if (channel != null) channel.disconnect();
    if (session != null) session.disconnect();
}

关于问题的日志在这里:

tail:无法打开'log.txt'进行阅读:没有这样的文件或目录 尾巴:没有剩余文件

2 个答案:

答案 0 :(得分:0)

nohup java -jar foo.jar --server.port=10000 > log.txt 2> errors.txt & tail -f log.txt

您在此处运行两个单独的命令:

nohup java -jar foo.jar --server.port=10000 > log.txt 2> errors.txt
tail -f log.txt

这有竞争条件。第二个命令可以启动并尝试在第一个命令有机会创建文件之前打开log.txt

修复是确保在启动tail命令之前创建log.txt。你可以这样做:

touch log.txt
nohup java -jar foo.jar --server.port=10000 > log.txt 2> errors.txt &
tail -f log.txt

或者作为一行:

touch log.txt; nohup java etc... & tail -f log.txt

答案 1 :(得分:0)

  

提到下面提到的命令,并且我在命令末尾添加了> / dev / null 2>&1&以使用jsch运行后台进程

String command1 =“ nohup java -jar” + jarFileDir +“ /” + jarFileName +“ --server.port =” +端口+“>” + jarFileDir +“ /log.txt 2>” + jarFileDir +“ /errors.txt和tail -f“ + jarFileDir +” /log.txt> / dev / null 2>&1&“;