在shell脚本中超时,并使用超时报告这些输入

时间:2019-03-20 09:30:32

标签: linux shell timeout

我想使用带有成千上万个输入文件的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

但是,我仍然需要知道哪些输入文件失败。 怎样制作一个列表告诉我哪些输入文件是“超时”的?

2 个答案:

答案 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退出。否则,以下脚本将不起作用。如果您需要区分超时和其他错误,则不应使用退出状态124timeout使用退出状态来指示超时。因此,您可以根据需要检查命令的退出状态,以区分成功,错误或超时。

为使脚本简单易行,我假设您无需区分超时和其他错误。

我在修改脚本的地方添加了一些注释,以改进脚本或显示替代方案。

#!/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