我有一个bash脚本,可以监视上传目录。当它在目录中看到xml文件时。该脚本获取文件并调用使用xslt转换文件的java命令行程序。如果脚本或java命令行程序在处理期间抛出错误,我想将文件mv到不同的目录(错误)。然后给我发错误。
我打算放 exec 2> mail -s'语句错误处理'
在脚本的顶部以捕获stderr的输出。但这似乎并不优雅,也不会移动有问题的文件。
答案 0 :(得分:5)
您可以在bash中捕获错误条件(任何返回非内联处理的非零条件的语句):
trap func ERR
然后在func(你定义的一个函数)中,你可以做任何你需要清理的事情。
例如:
#!/bin/bash
function foo() {
echo "cleaning up"
}
trap foo ERR
echo "about to execute false"
false
echo "exiting"
运行它将导致:
./foo.sh
about to execute false
cleaning up
exiting
答案 1 :(得分:3)
这里你需要两件事。首先,确定程序是否失败。这通常由程序的main()
函数的返回值所知。如果程序返回任何不同的值,则会出错。
在任何情况下,您要做的第二件事是将标准错误输出捕获到文件以便以后邮寄它。所以:
if ! program inputfile 2> errorfile ; then
mv inputfile error_directory
mail -s "error" < errorfile
fi
rm errorfile
但是,您必须检查您的程序是否遵循此约定来发出错误信号。