当前位置: 首页 > 面试题库 >

Java在Linux上执行过程

沈飞跃
2023-03-14
问题内容

我已经为这个问题苦苦挣扎了一段时间,我似乎无法解决它。我已经尝试过不同的方法(Runtime.exec(),ProcessBuiler),但是似乎都没有用。

这是我的问题。我有一台经常打开的笔记本电脑。这台笔记本电脑运行一个Java工具,该工具通过usb连接到arduino,以打开和关闭房屋中的灯。我自己创建了这个程序,因此我也在做一些定期的维护工作。最近,我添加了一个从html界面重新启动程序的按钮(以防万一我有更新,或者由于其他原因我可能需要重新启动程序,或者我决定在不久的将来实现自动更新)。

其背后的想法是从第一个实例启动应用程序的第二个实例,然后从第一个实例System.exit(0)启动。

由于某种原因,我无法启动该应用程序的第二个实例。这是一些代码。

public void shutdown(boolean restart) {
        if (this.serial != null) {
            this.serial.disconnect();
        }

        if (restart) {
            System.out.println(this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath());
            String startupCommand = "java -jar \"" + this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath().replace("%20", " ") + "\"";
            ProcessBuilder builder = new ProcessBuilder();

//            String[] command = new String[1];
//            command[0] = "-jar \"" + (System.getProperty("user.dir") + "/Home_Automation_Executor.jar") + "\"";
            try {
//                //System.out.println("Restarting Home Automation with command: " + command[0]);
//                System.out.println("Restarting Home Automation with command: " + startupCommand);
//                Runtime.getRuntime().exec("bash");
//                Process proc = Runtime.getRuntime().exec(startupCommand);
                Process proc = builder.command(startupCommand).start();
                InputStream stderr = proc.getErrorStream();
                InputStreamReader isr = new InputStreamReader(stderr);
                BufferedReader br = new BufferedReader(isr);
                String line = null;
                System.out.println("<ERROR>");
                while ((line = br.readLine()) != null) {
                    System.out.println(line);
                }
                System.out.println("</ERROR>");
                int exitVal = 0;
                try {
                    exitVal = proc.waitFor();
                } catch (InterruptedException ex) {
                    Logger.getLogger(Engine.class.getName()).log(Level.SEVERE, null, ex);
                }
                System.out.println("Process exitValue: " + exitVal);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        System.out.println("Terminating Home Automation");
        System.exit(0);
    }

java.io.IOException:无法运行程序“ java -jar” / Users / NightWalker / Dropbox /
Development /源代码/ Java /
NightWare工具/家庭自动化/家庭自动化执行器/dist/Home_Automation_Executor.jar”:错误=
2,在home.automation.executor.Engine.shutdown(Engine.java:186)处的java.lang.ProcessBuilder.start(ProcessBuilder.java:460)处没有此类文件或目录.home.automation.executor.webserver.HTTPGenerator._handleActionCommand(
HTTPGenerator.java:190)在home.automation.executor.webserver.HTTPGenerator._generateHTTPPage(HTTPGenerator.java:165)在home.automation.executor.webserver.HTTPGenerator.getHTTPPage(HTTPGenerator.java:58)在home.automation.executor
.webserver.HTTPRequestHandler.run(HTTPRequestHandler.java:160)原因:java.io.IOException:错误=
2,java.lang中没有此类文件或目录。java.lang.UNIXProcess。(UNIXProcess.java:53)处的UNIXProcess.forkAndExec(本机方法)java.lang.ProcessBuilder.start(ProcessBuilder.java:453处的java.lang.ProcessImpl.start(ProcessImpl.java:91)处的UNIXProcess.forkAndExec(本机方法)
)…另外5个


问题答案:

问题是这样的:

String startupCommand = "java -jar \"" + this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath().replace("%20", " ") + "\"";

/* more stuff */ builder.command(startupCommand);

这意味着Jav将寻找 名为 的命令java -jar ...stuff with spaces...。但是您想要的是,Java查找一个名为的命令,java并为该命令提供几个参数。

你应该用

/*...*/ builder.command("java", "-jar", jarLocation) /*...*/


 类似资料:
  • 问题内容: 我开始在Linux上进行pthread编程,而在最初的程序中,我完全感到困惑。下面是我正在运行的程序 我想知道的第一件事是线程执行的顺序不是顺序的? 第二件事是我故意放置print(“ amit”); 看到main确实在线程1终止期间停止了,但是在输出中我们看到的是首先执行了printf语句。整个过程的输出是 线程1 线程2 amitThread 1返回:0 线程2返回:0 问题答案:

  • 问题内容: 我正在通过Java上的JSch建立ssh连接,在我尝试运行此.sh文件之前,一切似乎都工作正常。外壳程序脚本的名称是 repoUpdate.sh ,它非常简单: 这是我在Linux控制台上直接获得的输出,其中包含命令的正确响应: 现在,这是带有ssh连接的我的方法的Java代码,该代码试图调用同一文件 我得到的答复如下: svn命令(版本9432)没有任何输出或执行的迹象。 我认为这可

  • 我正在通过Java上的JSch建立一个SSH连接,在我尝试运行它之前,一切似乎都很正常。sh文件。shell脚本的名称是

  • 问题内容: 我正在尝试从Java执行SOX命令,但不幸的是,它每次都会返回错误。其他所有SOX命令都可以正常运行!!这是代码: 当我在终端中执行相同的sox命令时,它的工作正常。我真的不明白问题是什么!是因为“ |” 符号?? 问题答案: 问题是Runtime.exec()无法理解shell概念,例如“ |”。而是尝试: 问题是exec直接运行二进制文件而不调用shell。“ |” 字符只能被外壳

  • 我需要对setter方法进行一些过滤,并考虑修改它们,例如: 我不记得有任何这样的实现,它可能不合法(或至少不合适)。我是否应该编写名为的附加setter方法,将作为默认值?这种方式似乎不是打破豆子的方法。 第三个选项是像这样准备单独的过滤器类: 我认为这是常用的用法;但是第二种选择似乎更接近面向对象方法。哪种方式是正确的方式?

  • 我对shell脚本和ssh命令等特别陌生。我想知道我是否可以在从一台服务器上载/下载文件到另一台服务器时自动执行简单的sftp提示。 以下是我的工作: 命令:sftpusername@ServerHost 我基本上希望实现自动化,因为我将调用一个脚本,该脚本将通过源服务器上的InfoSphere Datastage序列作业将文件从源服务器上传到远程服务器。 请原谅我的无礼,如果这个问题没有意义,如