2016-11-10 146 views
1

我想检查是否有错误的最后一条命令,因此将stderr重定向到一个文件并检查文件中的“错误”字符串(只有一个可能的。错误在这种情况下)bash:脚本看到的重定向文件'不存在'

我的脚本看起来像下面:

#aquire lock 

rm -f /some/path/err.out 
MyProgramme 2>/some/path/err.out & 

if grep -i "error" /some/path/err.out ; then 
    echo "ERROR while running MyProgramme, check /some/path/err.out for error(s)" 
    #release lock   
    exit 1 
fi 

“如果”条件是给错误的err.out“没有这样的文件或目录”,不过,我可以看到该文件存在。

我错过了什么吗?..任何帮助表示赞赏。谢谢!

PS:我无法使用$检查退出代码?因为它在后台运行。

回答

-1

当你在后台启动MyProgramme,它可能是grep执行之前MyProgramme可以写(并由此创建)的文件/some/path/err.out。这就是为什么即使文件稍后在您自己检查时存在,grep也找不到它。

在使用grep检查文件之前,您可以使用wait等到后台作业完成。

+0

感谢您的回答。这里的程序运行永无止境。除了等待以外的其他方式? – Srikanth

+2

嗯我可能是错的,但我认为'>'导致文件被立即创建/截断? –

+0

@Srikanth如果程序永远不会结束,那么您怎么知道它在哪一点打印“错误”?你想等多久?如果“err”文件不存在,您是否要立即退出脚本?我的意思是如果程序永远运行或很长一段时间,那么不应该检查是否在最后或至少定期发生错误。 –

0

除了在拨打grep时可能不存在的文件之外,您只能拨打grep一次,它只能看到文件中当前的任何数据。 grep在文件到达结束时不会继续读取,等待MyProgramme完成。相反,我会建议使用命名管道作为grep的输入。这将导致grep继续从管道读取,直到MyProgramme确实完成。

#aquire lock 

rm -f /some/path/err.out 
p=/some/path/err.out 
mkfifo "$p" 
MyProgramme 2> "$p" & 


if grep -i "error" "$p" ; then 
    echo "ERROR while running MyProgramme, check /some/path/err.out for error(s)" 
    #release lock   
    exit 
fi