【问题标题】:Timed exit from a shell command定时退出 shell 命令
【发布时间】:2012-01-02 07:12:13
【问题描述】:

我有一个 shell 脚本来生成两种类型的报告。每个报告都是通过执行一个 Sweave 脚本然后从生成的 tex 文件中编译一个 PDF 生成的。

eval "R CMD Sweave Weekly.Rnw"
eval "pdflatex Weekly.tex"
eval "R CMD Sweave Daily.Rnw"
eval "pdflatex Daily.tex"

例如,如果在执行“R CMD Sweave Weekly.Rnw”时出错,它会退出但仍会生成一个 tex 文件(我已经检查过无法停止),并且该 tex 文件无法在 pdflatex 中正确编译,即'pdflatex Weekly.tex' 命令会挂起,shell 脚本不会移动到下一个 'R CMD Sweave Daily.Rnw'。

现在,我的问题: 如果我知道某个 shell 命令不应该花费更多的 30 秒,有没有办法在几分钟(或任意时间间隔)后诱导该命令的定时退出(假设它挂起)?或者,有没有办法在编译tex文件时遇到错误后强制关闭latex引擎?

【问题讨论】:

标签: r shell sweave


【解决方案1】:

使用pdflatex -halt-on-error 阻止pdflatex 提问。

【讨论】:

  • 你的意思是pdflatex -interaction=batchmodepdflatex -halt-on-error 让 pdflatex 在第一个错误时退出。
  • 是的,但这就是重点……如果您知道文件已损坏,为什么还要麻烦生成更多错误?批处理模式还有其他含义,因此它可能是也可能不是您想要的。
  • pdflatex -interaction=nonstopmode 似乎效果最好,因为它有助于跳过所有用户交互,这些交互通常是与错误相关的交互。
【解决方案2】:

请参阅R.utils::evalWithTimeoutsetTimeLimit - 我相信,当达到超时并且用户可以中断命令时,这些可以中断命令、shell 或其他方式。

【讨论】:

    【解决方案3】:

    或者,如果该 pdflatex 是从 R CMD check 调用的,并且您不知道如何将参数传递给 pdflatex,并且您使用的是 Windows,那么另一种选择是:

    • 开始->程序->MikTex 2.9->维护(管理员)->设置(管理员)

    然后:

    • 点击刷新FNDB
    • 点击更新格式
    • 即时安装缺少的软件包更改为

    这应该会修复 R CMD 检查似乎挂起错误“检查插图 PDF 的重新构建...”或“检查 PDF 版本的手册...”问题。

    【讨论】: