我想使用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/

10-16 16:19