我有一个复杂的文档设置,其中我必须生成多个文档版本。我想并行启动这些运行以加快速度 - 并且我想从 PdfTeX 内部控制这一点。为此,我使用 PdfTeX 中的宏启动这些运行,如下所示
\immediate\write18{/Users/xyz/TEX/makeParallel \jobname \space #1 \space }
这很好用,但会产生顺序执行,这不是我想要的。所以我尝试了
\immediate\write18{/Users/xyz/TEX/makeParallel \jobname \space #1 \space & }
然而,这会导致日志文件被截断,并且 PDF 阅读器拒绝打开 2K 字节的 PDF 文件。
最初我怀疑某些东西在 PdfTeX 运行时重新进入时会出现问题。minted
例如,一个候选是。所以我完全复制了所有源文件和构建目录以分离实例。现在,也就是 30 小时后,我开始有点绝望了。无论我做什么,顺序执行总是有效,并行版本始终崩溃。我已经尝试了各种技巧,例如在 shell 脚本中将 PdfTeX 发送到后台而不是在\write18
等等。它仍然是一样的。看起来一些我的构建链中的进程(包括makeindex
,BibTeX 等)违反了我的想法并且不能干净地重入。
知道这是啥吗?!?
更多细节:评论者正确地指出我没有提供足够的信息 - 这是因为我尝试了太多不同的变体但都没有起作用。
最初我没有使用脚本,而是直接启动了 PdfTeX,\immediate\write18
这样做确实有效(但仅限于在前台运行时,即末尾没有 &)。然后我切换到 shell 版本,因为这样可以更轻松地更改命令并使其正确,因为对我来说,所需的 TeX 转义符不如 shell 广为人知。
不同的运行根本不共享任何文件:shell 脚本首先生成 tex 运行中使用的所有文件的完整副本。事实上:minted
它的缓存系统带来了很多问题,所以我决定采取激进的做法,只是复制全部的环境。
我是从 TeXStudio 运行这些作业write18
,而不是在最后将它们作为并行作业运行:我从 TeXStudio 运行这些作业,在那里预览、编辑和进行检查。我的用例要求在 TeXStudio 前台作业完成时准备好所有其他 6 个版本。所以我必须尽早启动它们。
\jobname
是第一个 shell 参数,我需要它在复制的环境中访问正确的文件名。#1
是第二个 shell 参数,它由诸如 这样的宏填充\backJob{shortVersion}
。然后,shell 脚本使用此信息创建一个包含所有必需源文件的适当命名的目录,然后在那里启动 PdfTeX 运行。如果我手动启动运行:一切都很好,据我所知没有触及其他文件。如果我在前台启动脚本:还是一样。如果我在后台启动 tex 运行(通过将脚本在后台运行或在脚本内部将 pdftex 在后台运行):它会中断。
必须是一些被重复使用的文件某处。也许有些是花哨的/tmp
,或者有些/hidden/somewhere/in/the/system
是我错过的。但目前我的大脑似乎没有建议了。我还尝试-recorder
使用命令行选项来捕获任何重叠的文件,但没有。
使调试变得更加困难的是海森堡现象的本质。只有当我\write18
在某个地方打开 shell 后台的情况下从内部运行此程序时,问题才会出现。
答案1
找到了! :-)
\immediate\write18
该问题似乎与在特定后台活动情况下处理启动进程的输出的方式有关。
\immediate\write18{/Users/cap/TEX/makeParallel \jobname \space #1 \space > OUTPUT 2>ERROR &}
工作正常。
问题在于
\immediate\write18{/Users/cap/TEX/makeParallel \jobname \space #1 \space &}
到目前为止,治疗效果不错。关于诊断,我怀疑:shell 进程想要在 stdout 和/或 stderr 上生成内容,但没有地方可以这样做;由于后台运行,也没有合理的终端连接 - 所以有人决定让进程崩溃。这会导致不可预测的结局、损坏的 pdf 文件、日志文件在输出行中间终止等。