java - 从 Java 启动时进程不会退出

标签 java process

我正在我的 Java 应用程序中作为单独的进程启动 WebTorrent-CLI。我正在使用zt-exec用于管理流程。当使用以下命令启动 WebTorrent 时,它应该在下载给定索引(--select 的值)处的文件后退出。

"D:\downloadmanager\node\webtorrent.cmd" download "magnet:?xt=urn:btih:08ada5a7a6183aae1e09d831df6748d566095a10&dn=Sintel" --select 0 --out "D://nf/"

正如预期的那样,当使用上面的命令从命令行启动 webtorrent-cli 时,它会在下载第 0 个文件后退出。但是,当我在 Java 应用程序中尝试相同的操作时,它完全忽略 --select 选项并继续下载 torrent 中的其他文件。

基本上,当从 Java 作为进程启动时,webtorrent 会忽略所有设置的选项(--select--out 或其他)。我应该提到这个库没有任何问题,因为最近我尝试用 commons-exec 替换它,但没有解决任何问题。另外,为了确保在启动进程时传递正确的命令,我在调用 executor.start() 之前打印命令。上面的命令是从进程开始之前打印命令检索到的输出中复制的。 这是该过程的启动方式:

@Override
public synchronized void start() throws IOException {
    if (mWasDownloadStarted || mWasDownloadFinished) return;

    mExec.getCommand().listIterator().forEachRemaining(s -> {
        System.out.print(s + " ");
    });

    mExec.start();
    setProcessId();

    mWasDownloadStarted = true;
    mWasDownloadStopped = false;
}

这是命令的准备方式:

private String buildCommand() {
    List <String> command = new ArrayList<>();
    command.add("\"" + mManager.mWTLocation + "\"");
    command.add("download");
    command.add("\"" + mManager.mMagnetUrl + "\"");

    if (mManager.mFileIndex >= 0) {
        command.add("--select " + mManager.mFileIndex);
    }

    if (mManager.mSaveTo != null) {
        command.add("--out \"" + mManager.mSaveTo + "\"");
    }

    mManager.mExec.command(command);

    String cmdStr = "";
    for (String s : command) {
        cmdStr = cmdStr.concat(s + " ");
    }

    return cmdStr.trim();
}

可能出了什么问题?

最佳答案

好的,所以我能够解决这个问题。

指定为 --out 值的路径后面的 / 字符导致了问题。为了解决这个问题,我在 node_modules/webtorrent-cli/bin/cmd.js 中添加了一行来打印传递给 webtorrent 的参数:

console.log(process.argv)

使用/,该行的输出如下所示:

[ 'D:\\downloadmanager\\node\\node.exe',
  'D:\\downloadmanager\\node\\node_modules\\webtorrent-cli\\bin\\cmd.js',
  'download',
  'magnet:?xt=urn:btih:08ada5a7a6183aae1e09d831df6748d566095a10&dn=Sintel',
  '--select',
  '0',
  '--out',
  'D:\\nf"' ]

请注意 D:\\nf 后面路径中包含的 "。当从路径中删除 / 时,引号就会消失,webtorrent 将按预期运行。

我怀疑这是 webtorrent 中的错误。我认为 zt-exec(或者也许是我)做了一些愚蠢的事情。

有点不相关,但我想我还应该提到,我必须用引号将每个选项的每个值(甚至索引)括起来,以消除其他令人讨厌的错误(例如:错误 87,参数不正确)

关于java - 从 Java 启动时进程不会退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56231745/

相关文章:

java - 后台服务始终运行

java - 在 Eclipse RCP 中嵌入 Silverlight 应用程序

java - Activity 不显示 onClick

java - 标签中嵌入 Jaxb 标签

android - 跨进程共享状态变量

java - 在 Android 上,无法从 java 应用程序运行 procrank

java - 从链表中删除n个元素(这里处理节点)

linux - linux中的进程分组

linux - 是否将进程绑定(bind)到特定的DNS查找?的Linux

c - 发出 wait() 时进程终止