jsch& nohup - 程序无法启动

时间:2012-09-13 14:10:51

标签: java jsch nohup

我想在后台使用jsch和'nohup with&'开始我的程序命令。这是我的代码:

    String command = "sudo nohup -jar [path to my jar] &";
    try{
        java.util.Properties config = new java.util.Properties();
        config.put("StrictHostKeyChecking", "no");
        JSch jsch = new JSch();
        Session session = jsch.getSession(user, host, 22);
        session.setPassword(password);
        session.setConfig(config);
        session.connect();
        System.out.println("Connected");

        Channel channel = session.openChannel("exec");
        ((ChannelExec)channel).setPty(true);
        ((ChannelExec)channel).setCommand(command);
        channel.setInputStream(null);
        ((ChannelExec)channel).setErrStream(System.err);

        InputStream in = channel.getInputStream();
        channel.connect(); 
        byte[] tmp = new byte[1024];
        while (true) {
            while (in.available() > 0) {
                int i = in.read(tmp, 0, 1024);
                if (i < 0) {
                    break;
                }
                System.out.print(new String(tmp, 0, i));
            }

            if (channel.isClosed()) {
                System.out.println("exit-status: " + channel.getExitStatus());
                break;
            }

            try {
                Thread.sleep(1000);
            } catch (Exception ee) {
            }
        }
        channel.disconnect();
        session.disconnect();
        System.out.println("DONE");
    } catch(Exception e) {
        e.printStackTrace();
    }

作为输出我得到:

Connected
exit-status: 0
DONE

但程序未启动。没有'&amp;'它有效,但有了它。同样的情况是当我将nohup命令放入.sh脚本然后运行它。任何想法如何解决这个问题?

提前致谢!

1 个答案:

答案 0 :(得分:1)

3年后......

我最近遇到了同样的问题。 我用以下方法解决了这个问题:

<?xml version = "1.0" encoding = "UTF-8"?>
<ns0:klanten xmlns:ns0 = "http://integratie.com/typen/klant/klantmvs/1.0">
<ns0:klant xmlns:ns0 = "http://integratie.com/typen/klant/klantmvs/1.0">
        <ns0:klantId MVS = "36301586">36301586</ns0:klantId>
        <ns0:accounts>
            <ns0:account>
                <ns0:accountVolgnummer>464</ns0:accountVolgnummer>
                <ns0:betaalwijze>AGI</ns0:betaalwijze>
                <ns0:classificatie>B2C</ns0:classificatie>
                <ns0:gewensteNotaMedium>VZD</ns0:gewensteNotaMedium>
                <ns0:bankrekening>
                    <ns0:bankrekeningnummer>BNGH0285108743</ns0:bankrekeningnummer>
                    <ns0:bankrekeninghouder/>
                    <ns0:bankrekeningland/>
                    <ns0:financieleInstelling/>
                    <ns0:standaardrekeningIndicator>true</ns0:standaardrekeningIndicator>
                </ns0:bankrekening>
                <ns0:startdatum>2014-12-12</ns0:startdatum>
                <ns0:einddatum>2015-03-09</ns0:einddatum>
            </ns0:account>
            <ns0:account>
                <ns0:accountVolgnummer>3</ns0:accountVolgnummer>
                <ns0:betaalwijze>AGI</ns0:betaalwijze>
                <ns0:classificatie>B2C</ns0:classificatie>
                <ns0:gewensteNotaMedium>VZD</ns0:gewensteNotaMedium>
                <ns0:bankrekening>
                    <ns0:bankrekeningnummer>BNGH0285108743</ns0:bankrekeningnummer>
                    <ns0:bankrekeninghouder/>
                    <ns0:bankrekeningland/>
                    <ns0:financieleInstelling/>
                    <ns0:standaardrekeningIndicator>true</ns0:standaardrekeningIndicator>
                </ns0:bankrekening>
                <ns0:startdatum>2014-06-05</ns0:startdatum>
                <ns0:einddatum>2014-07-25</ns0:einddatum>
                </ns0:account>
        </ns0:accounts>
    </ns0:klant>
</ns0:klanten>

并重定向输出流。 在我看来,它取决于正在执行的程序。我有一个不同的脚本只是睡觉和打印日期到文件,它不需要任何重定向。它也独立于JSch。使用命令行ssh也存在问题。

我实际想要执行的命令需要将其输出流重定向到远离stdout。如果单独重定向stdout无法重定向错误流并使用((ChannelExec)channel).setPty(false); 关闭输入流可能会有所帮助。