我想使用Arlsumstat bit程序和上千个输入文件进行分析。
Arlsumstat_64bit读取输入文件(.arp)并写入结果文件(sumstat.out)。
每个输入都将基于参数“0 1”在结果文件(sumstat.out)上追加新行
因此,我编写了一个shell脚本来执行同一个文件夹中的所有输入文件(.arp)。
但是,如果输入文件包含错误,shell脚本将被阻塞,而不需要任何后续进程。因此,我找到了一个带有“timeout”的命令来处理我的问题。
我做了一个shell脚本如下
#!/bin/bash
for sp in $(ls *.arp) ;
do
echo "process start: $sp"
timeout 10 arlsumstat_64bit ${sp}.arp sumstat.out 1 0
rm -r ${sp}.res
echo "process done: $sp"
done
但是,我仍然需要知道哪些输入文件失败。
如何列一个列表告诉我哪些输入文件是“超时”的?
最佳答案
请参见手册页中的timeout
命令http://man7.org/linux/man-pages/man1/timeout.1.html
如果命令超时,并且保存状态未设置,则退出
状态为124。否则,退出命令状态。如果没有
指定了signal,则在超时时发送术语signal。术语
信号杀死任何不阻止或捕获该信号的进程。
可能需要使用KILL(9)信号,因为这个信号
无法捕获,在这种情况下退出状态是128 + 9而不是
一百二十四
你应该查明哪些程序可以退出代码arlsumstat_64bit
。我认为它应该退出状态0成功。否则下面的脚本将不起作用。如果需要区分超时和其他错误,则不应使用退出状态124
或使用timeout
来指示超时。因此,您可以检查命令的退出状态,以便在必要时区分成功、错误或超时。
为了保持脚本简单,我假设您不需要区分超时和其他错误。
我添加了一些评论,我修改了你的脚本,以改进它或显示替代方案。
#!/bin/bash
# don't parse the output of ls
for sp in *.arp
do
echo "process start: $sp"
# instead of using "if timeout 10 arlsumstat_64bit ..." you could also run
# timeout 10 arlsumstat_64bit... and check the value of `$?` afterwards,
# e.g. if you want to distinguish between error and timeout.
# $sp will already contain .arp so ${sp}.arp is wrong
# use quotes in case a file name contains spaces
if timeout 10 arlsumstat_64bit "${sp}" sumstat.out 1 0
then
echo "process done: $sp"
else
echo "processing failed or timeout: $sp"
fi
# If the result for foo.arp is foo.res, the .arp must be removed
# If it is foo.arp.res, rm -r "${sp}.res" would be correct
# use quotes
rm -r "${sp%.arp}.res"
done
关于linux - 在shell脚本中超时,并使用超时报告这些输入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55257483/