Tag: 进程

启动Safari并等待它关闭

题 我想启动Safari Web浏览器作为访问特定网站的过程,然后等到它关闭。 一种特殊情况是浏览器可能已经打开并运行,因为用户可能已经访问过某个网站。 在这种情况下,浏览器可能会在现有窗口中打开一个新选项卡,新启动的进程将立即终止。 这不应该混淆我的等待过程:我要么想要一个新的浏览器窗口(如果可以以某种方式强制执行,可能通过命令行参数)并等待关闭,或者保持现有的浏览器窗口并等到所有选项卡由此产生我的过程已关闭。 环境 我认为没关系,但我的编程环境是Java ,你可以假设我知道浏览器的路径。 例 我可以获得预期行为的唯一浏览器是Internet Explorer (叹息)。 在这里,我需要基本上在一个临时文件夹中创建一个新的批处理脚本 start /WAIT “” “C:\Program Files\Internet Explorer\iexplore.exe” -noframemerging http://www.test.com/ 然后我运行批处理脚本而不是直接浏览器,并在等待完成后删除它。 预期的过程 使目标过程更清晰: 我的程序开始了。 我的程序将Safari浏览器作为单独的进程启动,并提供一个URL作为该进程的参数进行访问。 Safari浏览器作为新进程异步运行,并访问提供的URL。 到目前为止,这很容易。 启动新进程(Safari浏览器)后,我自己的程序应该等待所述进程终止。 这是困难的部分,因为 许多现代浏览器启动多个进程。 我需要等待所有这些。 许多现代浏览器可能以某种方式“脱离”我自己启动的进程。 对不起,我不知道一个更好的词,我的意思是:我启动一个进程然后启动另一个进程并立即终止,而另一个进程继续运行。 如果我等待我的程序最初启动的浏览器进程,则在浏览器仍处于打开状态时等待将完成。 上面的一个特例是在许多浏览器中实现的选项卡式浏览:如果浏览器在我启动时已经打开(在用户启动的单独进程中),我新启动的浏览器进程可能会简单地传达URL以访问现有流程并终止。 当我的程序认为她已关闭浏览器时,用户仍在我提供的URL上。 通过指定特殊的命令行参数(例如IE的noframemerging可能会禁止此问题。 一旦浏览器终止或者与我提供的URL相关的所有标签都已关闭,我的程序将停止等待,而是继续开展业务。 用例是我有一个可以在本地运行或在服务器上运行的Web应用程序。 如果它在本地运行,它将启动Web服务器,然后打开浏览器以访问条目页面。 关闭浏览器后,该Web应用程序也应该关闭。 这适用于Internet Explorer。 对于所有其他情况,用户必须关闭浏览器,然后明确地关闭Web应用程序。 因此,如果我能够可靠地等待Safari完成,这将使用户体验更好。 方案偏好: 解决方案按以下顺序是优选的 任何与纯Java JRE一起提供的东西。 这包括浏览器的特殊命令行参数。 需要我做的事情,例如,创建批处理脚本(例如在IE的情况下)。 任何需要第三方开源库的东西。 任何需要3rth党闭源图书馆的东西。 […]

在Runtime.getRuntime()。exec中有2个可执行文件的空格

我有一个命令,我需要在这些行中使用java运行: C:\path\that has\spaces\plink -arg1 foo -arg2 bar “path/on/remote/machine/iperf -arg3 hello -arg4 world” 当路径没有空格时,此命令工作正常,但是当我有空格时,我似乎无法使其工作。 我尝试过以下操作,运行Java 1.7 String[] a = “C:\path\that has\spaces\plink”, “-arg1 foo”, “-arg2 bar”, “path/on/remote/machine/iperf -arg3 hello -arg4 world” Runtime.getRuntime().exec(a); 以及 String[] a = “C:\path\that has\spaces\plink”, “-arg1 foo”, “-arg2 bar”, “path/on/remote/machine/iperf”, “-arg3 hello”, “-arg4 world” Runtime.getRuntime().exec(a); 但似乎都没有做任何事情。 我有什么问题吗?

java.exe进程使用更多内存并且不释放它

我有一个java应用程序,在任何复杂执行之前处于空闲状态时,在Heap中使用23 MB并且TaskManager中的java.exe进程大小约为194 MB。 经过一些复杂的操作后,java.exe的大小增长到大约500MB,堆大小也随之增长。 通过调用System.gc()方法,在几个完整的GC之后,堆大小减少到23MB。 但java.exe的大小从大约600MB减少到大约237MB,其中仍然有大约43 MB的数据。 有没有办法减少这个? 或者是由于某些行为?

如果父进程不在Java中使用stdout / stderr,为什么进程会挂起?

我知道如果你在Java中使用ProcessBuilder.start来启动外部进程,你必须使用它的stdout / stderr(例如,见这里 )。 否则外部进程会在启动时挂起。 我的问题是为什么它以这种方式工作。 我的猜测是JVM将执行过程的stdout / stderr重定向到管道,如果管道没有空间,则对管道的写入阻塞。 是否有意义? 现在我想知道为什么 Java会这样做。 这个设计背后的理由是什么?

在Java中重定向stdin和stdout

我正在尝试重定向java中的子进程的stdin和stdout,最终我将输出转到JTextArea或其他东西。 这是我目前的代码, Process cmd = Runtime.getRuntime().exec(“cmd.exe”); cmd.getOutputStream().write(“echo Hello World”.getBytes()); cmd.getOutputStream().flush(); byte[] buffer = new byte[1024]; cmd.getInputStream().read(buffer); String s = new String(buffer); System.out.println(s); 输出如下: Microsoft Windows [Version 6.1.7601] Copyright (c) 2009 Microsoft Corporation. All rights reserved. C:\(Current Directory)> 我期待看到输出的“Hello World”字符串。 也许是因为父母的过程没有长久存活? 我也希望能够发送和接收多个命令。

在Java 6中使用inheritance的stdin / stdout / stderr启动进程

如果我通过Java的ProcessBuilder类启动一个进程,我可以完全访问该进程的标准输入,标准输出和标准错误流,如Java InputStreams和OutputStreams 。 但是,我找不到将这些流无缝连接到System.in , System.out和System.err 。 可以使用redirectErrorStream()来获取包含子进程的标准输出和标准错误的单个InputStream ,然后循环遍历并通过我的标准输出 – 但我找不到一种方法来做到这一点并让用户如果我使用C system()调用,他或她可以输入进程。 这在Java SE 7出现时似乎是可能的 – 我只是想知道现在是否有解决方法。 如果子进程中isatty()的结果通过重定向,则加分。

如何使用jProgress栏进行ProcessBuilder进程?

我正在开发一个java应用程序,通过ProcessBuilder执行CMD命令,使usb驱动器可启动。 这需要几秒钟,因为我想显示一个jprogressbar来增加GUI,我已经尝试过,我没有,请帮助我。 这是我的代码: private void btn_StartActionPerformed(java.awt.event.ActionEvent evt) { String[] command ={“CMD”, “/C”, “MyCmdCommand”}; ProcessBuilder probuilder = new ProcessBuilder( command ); probuilder.directory(new File(dri+”:\\”)); try { Process process = probuilder.start(); process.waitFor(); } catch(IOException e) { JOptionPane.showMessageDialog(this, e); } } 我如何在我的代码和我必须使用的地方使用JProgressbar? 谢谢

CreateProcess error = 2,系统找不到指定的文件

我正在java编写一个程序,它将执行winrar并将放在h:\myjar.jar的jar文件解压缩到文件夹h:\new 。 我的java代码就是这样的 import java.io.File; import java.io.IOException; public class MainClass { public static void main(String[] args) { Runtime r = Runtime.getRuntime(); Process p = null; try { File dir = new File(“C:/Program Files/WinRAR”); p = r.exec(“winrar xh:\\myjar.jar *.* h:\\new”, null, dir); } catch (IOException e) { e.printStackTrace(); } } } 当我执行此操作时,我收到此错误 java.io.IOException: Cannot run program […]

直到Runtime.getRuntime()。exec()完成执行后才会显示Swing消息

我是Swing的新手。 我正在尝试创建一个swing包装器,允许用户浏览并选择一个文件夹,该文件夹路径用作控制台.exe程序的命令行参数。 在他们选择文件夹并单击“启动程序”按钮后,我希望摆动窗口显示一条消息,告诉他们程序正在处理(并显示一个时钟的GIF动画),运行外部程序,然后显示另一条消息当该程序完成执行时。 我遇到的问题是“处理”消息直到外部程序完成执行后才会显示。 在下面的代码中,单击“启动程序”按钮时会执行onLaunchProgram方法。 我尝试过revalidate()和repaint(),但是没有变化。 我有一个“完成”消息的waitFor(),但即使我把它拿出来,“处理”消息和gif也不会显示,直到外部程序完成执行。 … JTextField txtFolder = new JTextField(); JLabel lblMessage = new JLabel(); JLabel lblPic = new JLabel(); JButton btnLaunchApplication = new JButton(“Launch Program”); … btnLaunchApplication.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { onLaunchProgram(evt); } }); … if (returnVal == JFileChooser.APPROVE_OPTION){ file = fc.getSelectedFile(); txtFolder.setText(file.getAbsolutePath()); } … private void onLaunchProgram(ActionEvent […]

用于强制终止子进程的Java工具/方法

我正在寻找一个允许我强制杀死子进程的Java工具/包/库。 此工具/包/库必须在Windows平台上运行(必需)。 需要支持Linux / Unix。 我的问题 我的Java代码创建了一个子进程,它根本不会对杀死子进程的标准Java方式做出反应:process.destroy(),而且,由于我没有子进程的源代码,我无法对其进行编程以更好地处理终止请求。 我已经尝试在调用destroy()之前关闭子进程的错误输入和输出流,并且没有效果。 我甚至尝试将ctrlBreak信号(char = 3)直接传递给child.getOutputStream(),并再次收到相同的结果。 我终于找到的解决方法是: 在创建时获取子PID这可以通过在子项创建之前和之后getRuntime().exec(“tasklist /v”)进程列表在Windows中完成( getRuntime().exec(“tasklist /v”) ) 使用子PID发出强制终止系统命令 在Windows中: getRuntime().exec(“taskkill /pid ” + childPid + ” /f”) 但是 – 这是复杂的代码我不想调试和维护,加上问题本身,我毫不怀疑,以前遇到过许多其他java开发人员,这让我希望这样的Java工具/包/库已经存在。 我只是不知道它的名字…… PS:我的子进程是由Runtime.getRuntime().exec(cmd) ,但我使用ProcessBuilder得到了相同的行为。