2012-01-02 130 views
2

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

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文件将不编译在pdflatex中正确,即'pdflatex Weekly.tex'命令会挂起,shell脚本不会移动到下一个'R CMD Sweave Daily.Rnw'。

现在,我的问题: 如果我知道某个shell命令不应该花费更多的30秒,是否有一种方法可以在几分钟之后(或者某些情况下)导致从该命令(假定挂起)任意时间流逝)?或者,在编译tex文件时遇到错误,是否有强制关闭乳胶引擎的方法?

感谢。

+3

你为什么使用'eval'?正如bash faq说的那样*“eval是邪恶的拼写错误,如果答案是eval,那么你问的是错误的问题”* – SiegeX 2012-01-02 07:14:51

+0

有些情况下'eval'是合适的;很明显这是其中之一。 – 2012-01-02 07:26:32

+1

[命令行命令在一段时间后自动杀死命令]的可能的重复(http://stackoverflow.com/questions/601543/command-line-command-to-auto-kill-a-command-在一定的时间内) – 2012-01-02 07:29:50

回答

3

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

+1

您的意思是'pdflatex -interaction = batchmode'。 'pdflatex -halt-on-error'让pdflatex在第一个错误时退出。 – 2012-01-02 20:12:40

+0

是的,但那是关键......如果您知道该文件已损坏,为什么还要生成更多错误?批处理模式有其他含义,所以它可能会或可能不会是你想要的。 – 2012-01-02 20:33:53

+1

'pdflatex -interaction = nonstopmode'似乎效果最好,因为它有助于跳过所有用户交互,这通常是与错误相关的交互。 – Arjun 2012-01-02 22:35:01

2

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

0

或者,如果pdflatex正在从R CMD check叫的,你不知道如何传递参数给pdflatex,而你使用的是Windows,那么另一种方法是:

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

然后:

  • 点击种刷新FNDB
  • 点击更新格式
  • 变化安装缺少的包上即时没有

这应该可以解决将R CMD检查似乎挂在错误“检查重新构建的小插曲PDF文件...”或“检查PDF手册的版本...”问题。