我想使用带有成千上万个输入文件的Arlsumstat_64bit程序进行分析。
Arlsumstat_64bit读取输入文件(.arp)和写入结果文件(sumstat.out)。
每个输入将基于参数“ 0 1”在结果文件(sumstat.out)上添加新行。
因此,我编写了一个Shell脚本来执行同一文件夹中的所有输入(* .arp)。
但是,如果输入文件包含错误,则shell脚本将被阻塞,而无需任何后续处理。因此,我找到了一个带有“超时”的命令来处理我的问题。
我做了如下的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
但是,我仍然需要知道哪些输入文件失败。 怎样制作一个列表告诉我哪些输入文件是“超时”的?
答案 0 :(得分:0)
下面的代码应该对您有用:
#!/bin/bash
for sp in $(ls *.arp) ;
do
echo "process start: $sp"
timeout 10 arlsumstat_64bit ${sp}.arp sumstat.out 1 0
if [ $? -eq 0 ]
then
echo "process done sucessfully: $sp"
else
echo "process failed: $sp"
fi
echo "Deleting ${sp}.res"
rm -r ${sp}.res
done
答案 1 :(得分:0)
请参见手册页中的timeout
命令http://man7.org/linux/man-pages/man1/timeout.1.html
如果命令超时,并且未设置--preserve-status,则退出 状态124。否则,以状态COMMAND退出。如果不 指定信号,超时后发送TERM信号。期限 signal杀死任何不会阻塞或捕获该信号的进程。 可能需要使用KILL(9)信号,因为该信号 无法捕获,在这种情况下,退出状态为128 + 9,而不是 124。
您应该找出程序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