【问题标题】:How to use timeout command with a own function?如何使用带有自己功能的超时命令?
【发布时间】:2012-08-09 17:32:51
【问题描述】:

我想使用带有自己功能的超时命令,例如:

#!/bin/bash
function test { sleep 10; echo "done" }

timeout 5 test

但是当调用这个脚本时,它似乎什么也没做。 shell 在我启动后立即返回。

有没有办法解决这个问题,或者不能在自己的函数上使用超时?

【问题讨论】:

标签: bash function shell timeout


【解决方案1】:

在自己尝试实现这一目标时发现了这个问题,并根据@geirha 的回答工作,我得到了以下工作:

#!/usr/bin/env bash
# "thisfile" contains full path to this script
thisfile=$(readlink -ne "${BASH_SOURCE[0]}")

# the function to timeout
func1()
{ 
  echo "this is func1"; 
  sleep 60
}

### MAIN ###
# only execute 'main' if this file is not being source
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
   #timeout func1 after 2 sec, even though it will sleep for 60 sec
   timeout 2 bash -c "source $thisfile && func1"
fi

由于timeout 在新的shell 中执行其给出的命令,因此诀窍是让该子shell 环境获取脚本以继承您要运行的功能。第二个技巧是让它有点可读性......,这导致了thisfile 变量。

【讨论】:

    【解决方案2】:

    一种方法是做

    timeout 5 bash -c 'sleep 10; echo "done"'
    

    相反。虽然你也可以像这样hack up something

    f() { sleep 10; echo done; }
    f & pid=$!
    { sleep 5; kill $pid; } &
    wait $pid
    

    【讨论】:

      【解决方案3】:

      如果你将你的函数隔离在一个单独的脚本中,你可以这样做:

      (sleep 1m && killall myfunction.sh) & # we schedule timeout 1 mn here
      myfunction.sh
      

      【讨论】:

        【解决方案4】:

        timeout 需要一个命令并且不能在 shell 函数上工作。

        不幸的是,您上面的函数与/usr/bin/test 可执行文件的名称冲突,这会造成一些混乱,因为/usr/bin/test 会立即退出。如果你将你的函数重命名为(比如)t,你会看到:

        brian@machine:~/$ timeout t
        Try `timeout --help' for more information.
        

        这不是很有帮助,但可以说明正在发生的事情。

        【讨论】:

          【解决方案5】:

          timeout 似乎不是bash 的内置命令,这意味着它无法访问功能。您必须将函数体移动到一个新的脚本文件中,并将其作为参数传递给timeout

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-13
            • 2016-06-08
            • 2021-01-08
            • 1970-01-01
            • 2019-03-28
            相关资源
            最近更新 更多