从Java启动时进程不退出

从Java启动时进程不退出,java,process,Java,Process,我将在Java应用程序中作为一个单独的进程启动WebTorrent CLI。我正在使用它来管理流程。当使用以下命令启动WebTorrent时,它应该在下载给定索引(值--select)的文件后退出 "D:\downloadmanager\node\webtorrent.cmd" download "magnet:?xt=urn:btih:08ada5a7a6183aae1e09d831df6748d566095a10&dn=Sintel" --select 0 --out "D://nf

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

"D:\downloadmanager\node\webtorrent.cmd" download "magnet:?xt=urn:btih:08ada5a7a6183aae1e09d831df6748d566095a10&dn=Sintel" --select 0 --out "D://nf/"
正如预期的那样,当使用上面的命令从命令行启动第0个文件时,webtorrent cli在下载后确实会退出。但当我在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();
}
private String buildCommand(){
List命令=new ArrayList();
添加(“\”+mManager.mWTLocation+“\”);
添加(“下载”);
添加(“\”+mManager.mmagnetur+“\”);
如果(mManager.mFileIndex>=0){
添加(“--select”+mManager.mFileIndex);
}
如果(mManager.msavoint!=null){
添加(“--out\”“+mManager.msavive+”\”);
}
mManager.mExec.command(command);
字符串cmdStr=“”;
for(字符串s:命令){
cmdStr=cmdStr.concat(s+“”);
}
返回cmdStr.trim();
}

可能有什么问题?

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

指定为
--out
值的路径后面的
/
字符导致了问题。为了解决这个问题,我在
node\u 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中的一个bug。我认为zt exec(或者我)在做一些愚蠢的事情


有些不相关,但我想我还应该提到,我必须用引号括住每个选项的每个值,甚至索引,以消除其他严重错误(例如:
Error 87,参数不正确)

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

指定为
--out
值的路径后面的
/
字符导致了问题。为了解决此问题,我在
节点模块/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中的一个bug。我认为zt执行官(或者我)在做一些愚蠢的事情


有些不相关,但我想我还应该提到,我必须用引号括住每个选项的每个值,甚至索引,以消除其他严重错误(例如:
Error 87,参数不正确

Hi。出于调试目的,您应该编辑
webtorrent.cmd
文件,并为收到的参数添加输出。也许这会给你一个线索。如果参数是正确的,它与java无关,但与webtorrent。。。(可能是在调用webtorrent.cmd时启动了后台进程)@SirFartALot绝对可以尝试…酷名字顺便说一句!你好出于调试目的,您应该编辑
webtorrent.cmd
文件,并为收到的参数添加输出。也许这会给你一个线索。如果参数是正确的,它与java无关,但与webtorrent。。。(可能是在调用webtorrent.cmd时启动了后台进程)@SirFartALot绝对可以尝试…酷名字顺便说一句!