标签: processbuilder

java.io.IOException:error = 11

我遇到了一个奇怪的Java问题ProcessBuilder.代码如下所示(略微简化)

public class Whatever implements Runnable
{

public void run(){
        //someIdentifier is a randomly generated string
        String in = someIdentifier + "input.txt";
        String out = someIdentifier + "output.txt";
        ProcessBuilder builder = new ProcessBuilder("./whateveer.sh", in, out);
        try {
            Process process = builder.start();
            process.waitFor();
        } catch (IOException e) {
            log.error("Could not launch process. Command: " + builder.command(), e);
        } catch (InterruptedException ex) {
            log.error(ex);
        }
}

}
Run Code Online (Sandbox Code Playgroud)

whatever.sh读取:

R --slave --args $1 $2 <whatever1.R >> r.log    
Run Code Online (Sandbox Code Playgroud)

大量的实例Whatever被提交到ExecutorService …

java linux process processbuilder

7
推荐指数
1
解决办法
1万
查看次数

gradle:使用带空格的多个参数执行任务"type:Exec"

我有gradle任务应该在Windows操作系统上创建Websphere配置文件

task createProfile(type:Exec) {

    def commandToExecute = new StringBuffer()
    def profile = 'AppSrv02'
    def wasHome = 'C:/IBM new/WebSphere/AppServer'

    def str = new LinkedList <String> ();
    str.add('cmd')
    str.add('/c')
    str.add(wasHome + '/bin/manageprofiles.bat')
    str.add('-create')
    str.add('-profileName')
    str.add(profile)
    //str.add('-templatePath')
    //str.add(wasHome + '/profileTemplates/default')

    println (str)
    commandLine str.toArray()

}
Run Code Online (Sandbox Code Playgroud)

如果我取消注释注释行,在任务失败后再说:"C:/ IBM"无效的批处理文件,则会出现问题.如果我将profileTemplates放在包含空格的文件夹中,一切都可以正常工作.但模板应该是int isHome(有时候家庭有空间(

我有,现在想法为什么添加模板键值和空格影响Gradle尝试启动"C:/ IBM"而不是指定'C:/ IBM new/WebSphere/AppServer/bin/manageprofiles.bat'.似乎可能是java.lang.ProcessBuilder中的问题.

我尝试引用路径,通过添加, "/"" 但没有任何作用((((什么不是惊讶,因为ProcessBuilder意味着如果需要它自己引用.

所以,我问的是否有人遇到过类似的问题,并建议如何解决这个问题?提前致谢.

spaces batch-file exec gradle processbuilder

7
推荐指数
1
解决办法
1万
查看次数

如何在Windows中的ProcessBuilder java中设置PATH环境变量

我试图在java中为进程构建器设置PATH环境变量,我尝试了以下方法:

ProcessBuilder pb = new ProcessBuilder(command);
Map<String, String> mp = pb.environment();
mp.put("Path", "myPath");
pb.start();
Run Code Online (Sandbox Code Playgroud)

但是以下不起作用,进程构建器选择了默认的系统路径.我遇到了这个问题,这个技巧在我目前的项目中并没有帮助我.我该怎么办才能解决这个问题?

java environment-variables processbuilder

7
推荐指数
1
解决办法
1万
查看次数

从java中的ProcessBuilder调用时,EXE崩溃

我正在从JAVA ProcessBuilder调用一些EXE(7za.exe,pg_basebackup.exe,...).它在2或3天内没有任何问题(EXE将每天调用).之后,EXE不断崩溃.

7za.exe错误:
退出代码:: -1.073.741.502

Windows事件日志错误:
错误应用程序名称:7za.exe,版本:9.20.0.0,时间戳:0x4ce553f5错误模块名称:KERNELBASE.dll,版本:6.2.9200.21941,时间戳:0x5792e533
异常代码:0xc0000142
错误偏移量:0x000683ba
错误进程ID:0x10bc
错误应用程序启动时间:0x01d2cebdff3bb05a
错误应用程序路径:EXEpath\bin\7za.exe
错误模块路径:KERNELBASE.dll
报告ID:3d27046a-3ab1-11e7-93fe-00505680156e
错误包全名:
错误包相关应用程序ID:

代码段

File workingDir = new File(workingDirectory);
ProcessBuilder pb = new ProcessBuilder(argumentsList);
pb.redirectErrorStream(true);
pb.directory(workingDir);        
Process process = pb.start();
BufferedReader commandOutput = new BufferedReader(new 
InputStreamReader(process.getInputStream()));
String s = null;
while ((s = commandOutput.readLine()) != null) {
    print(s);
}
int exitCode = process.exitValue();
Run Code Online (Sandbox Code Playgroud)

在运行此代码的所有机器中也没有发生这种情况.是内存泄漏还是操作系统级错误?请指教.

提前致谢.

编辑1:c#中的同类错误.它还包含修复.
https://social.msdn.microsoft.com/Forums/vstudio/en-US/cb9a15ed-4401-47f1-8c78-0c63c3da677d/process-returns-0xc0000142-when-started-from-a-windows-service-prividing- the credentials?forum = clr
如何在java中实现它?

编辑2:Java作为服务运行(使用包装器)
Java版本:1.0.051
Windows版本:Windows Server 2012和R2(64位),Windows 7(64位),Windows 8(64位)

java windows exe processbuilder

7
推荐指数
1
解决办法
296
查看次数

在 java 中打开 shell 并与其 I/O 交互

我正在尝试打开一个 shell (xterm) 并与其交互(写入命令并读取 shell 的输出)

这是一个不起作用的代码示例:

public static void main(String[] args) throws IOException {
    Process pr = new ProcessBuilder("xterm").start();
    PrintWriter pw = new PrintWriter(pr.getOutputStream());
    pw.println("ls");
    pw.flush();
    InputStreamReader in = new InputStreamReader(pr.getInputStream());
    System.out.println(in.read());
}
Run Code Online (Sandbox Code Playgroud)

当我执行该程序时,会打开“xterm”窗口,并且不会输入“ls”命令。仅当我关闭窗口时,我才会打印“-1”,并且不会从 shell 读取任何内容

重要的-

我知道我可以使用:
Process pr = new ProcessBuilder("ls").start();

为了获得输出,但我需要打开“xterm”以供其他用途

多谢

java linux terminal process processbuilder

6
推荐指数
1
解决办法
4046
查看次数

Java - 在不同的进程中启动另一个类的 main

我需要一种干净的方法来启动带有 GUI 的 Java 程序的许多实例,并且我想以编程方式进行。我想运行的“程序”只是一个 .class 文件(一个带有 main 方法的编译后的 .java 文件),它应该显示一个 GUI 并独立于其他程序运行(作为它自己的进程)。我还需要向该程序传递一些参数。

检查 EDIT5 以获取完整的工作解决方案代码。

这是应该启动许多进程的类

package startothermain;

import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Starter {

    public static void main(String[] args) {
        int starts = 4;

        for (int i = 0; i < starts; ++i) {
            System.out.println("Starting an app");
            ProcessBuilder pb = new ProcessBuilder("java.exe", "-cp", "bin", "Started", "arg0");
            try {
                pb.start();
            } catch (IOException ex) {
                Logger.getLogger(Starter.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是应该启动并显示 GUI 的类

package …
Run Code Online (Sandbox Code Playgroud)

java netbeans program-entry-point runtime processbuilder

6
推荐指数
1
解决办法
6112
查看次数

使用 processBuilder 执行 shell 命令并与之交互

我正在尝试创建一个程序,允许我通过带有参数的终端(如果您想知道,它是用于树莓派的 OmxPlayer)执行命令,但我希望能够在启动后与它进行交互命令。

例如我想做: omxplayer -win x1 y1 x2 y2 然后可以按“p”暂停视频/音频媒体

我已经有了一些可以用参数启动 omxplayer 的东西(实际上它是“ls”,但它应该以完全相同的方式工作)但是我不明白一旦我通过 processBuilder 启动命令后如何与终端交互。

这是我目前所拥有的:

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class Main1 {

    public static void main(String a[]){

        InputStream is = null;
        ByteArrayOutputStream baos = null;
        List<String> commands = new ArrayList<String>();
        commands.add("ls");
        commands.add("-l");
        commands.add("/");
        ProcessBuilder pb = new ProcessBuilder(commands);
        try {
            Process prs = pb.start();
            is = prs.getInputStream();
            byte[] b = new byte[1024];
            int size = 0;
            baos = new ByteArrayOutputStream();
            while((size = …
Run Code Online (Sandbox Code Playgroud)

java shell command process processbuilder

6
推荐指数
1
解决办法
8907
查看次数

Java运行异步进程

我正在尝试运行异步进程,我不希望程序等到这些进程执行结束.我发现这个问题如何从Java程序中异步运行shell脚本,但它没有我想要的答案.

我正在做的是我只是运行bash进程,运行之后,我不希望Java程序等到它完成.这就是我所做的:

public void runCommandLine(String directory) throws IOException {
    Thread commandLineThread = new Thread(() -> {
        try {
            ProcessBuilder processBuilder = new ProcessBuilder(
                    "/bin/bash");
            processBuilder.directory(new File(directory));
            Process process = processBuilder.start();
            try (OutputStreamWriter osw = new OutputStreamWriter(process.getOutputStream())) {
                osw.write(command);
            }
            printStream(process.getErrorStream(), true);
            printStream(process.getInputStream(), true);
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    });
    commandLineThread.start();
    System.out.println("Task Dispatched");
}
Run Code Online (Sandbox Code Playgroud)

我还在main方法的末尾添加了另一个打印输出,所以我得到了这个输出:

Task Dispatched
Task Dispatched
End of psvm
Run Code Online (Sandbox Code Playgroud)

但是,由于这两个进程尚未终止,程序不会终止.

我该如何解决这个问题?

java multithreading asynchronous process processbuilder

6
推荐指数
1
解决办法
5067
查看次数

如何在执行前获取processbuilder命令

我想知道在它发生之前将执行的命令。

      String cmd[] = {"curl",
            "-X",
            "POST",
            "https://api.renam.cl/medicion/insert?access-token={Yoq3UGQqDKP4D1L3Y6xIYp-Lb6fyvavpF3Lm-8cD}",
            "-H",
            "content-type: application/json",
            "-d",
            json.toString()};

        ProcessBuilder pb = new ProcessBuilder(cmd);

        Log.debug("COMANDO.TOSTRING " + pb.command().toString());

        Process p = pb.start();

        Log.debug(p.getOutputStream().toString());

        p.waitFor();

        BufferedReader reader
                = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String readline;

        while ((readline = reader.readLine()) != null) {
            Log.debug(readline);
        }
Run Code Online (Sandbox Code Playgroud)

使用 readline 我有服务器答案输出,但我不知道如何获取我用 processbuilder 执行的 curl 命令。

编辑 1:

我只需要使用 linux 控制台发送此命令:

curl -X POST ' https://api.com/data/insert?access-token=Yoq3UGQqDKP4D1L3Y6xIYp-Lb6fyvavpF3Lm-8cD ' -H 'content-type: application/json' -d '{ "pm25":2, "timestamp ":1495077872, "dispositivo_mac": "12:34:56:78:90:12" }'

基本上我需要打印 ProcessBuilder 对象处理的 cmd 数组,以便在 star …

java linux curl processbuilder

6
推荐指数
1
解决办法
4865
查看次数

初始化复杂过滤器时出错。从 Kotlin 运行 ffmpeg 时出现无效参数错误

我正在为 ffmpeg 创建一个包装器,它具有以下方法:

fun executeCommand(args: Array<String>): AppRunner.AppResult {
    return appRunner.run(ffmpegPath, args)
}


class AppRunner {

    fun run(
        app: String,
        args: Array<String>,
        timeoutAmount: Long = 60000,
        timeoutUnit: TimeUnit = TimeUnit.SECONDS
    ): AppResult {
        val command = mutableListOf(app)
        command.addAll(args)

        val processResult = ProcessBuilder(command)
            .redirectOutput(ProcessBuilder.Redirect.PIPE)
            .redirectError(ProcessBuilder.Redirect.PIPE)
            .start()
            .apply {
                waitFor(timeoutAmount, timeoutUnit)
            }

        val exitCode = processResult.exitValue()
        val stdOut = processResult.inputStream.bufferedReader().readText()
        val stdErr = processResult.errorStream.bufferedReader().readText()

        return AppResult(exitCode, stdOut, stdErr)
    }

}
Run Code Online (Sandbox Code Playgroud)

和:

fun concatenateAudioFiles(files: Collection<File>, outFile: File) {
    val args = mutableListOf<String>()

    files.forEach { …
Run Code Online (Sandbox Code Playgroud)

java ffmpeg processbuilder kotlin

6
推荐指数
1
解决办法
5136
查看次数