我正在我的 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/