1

我想将 timeout 命令与自己的功能一起使用,例如:

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

timeout 5 test

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

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

4

5 回答 5

4

一种方法是做

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

反而。虽然你也可以破解这样的东西

f() { sleep 10; echo done; }
f & pid=$!
{ sleep 5; kill $pid; } &
wait $pid
于 2012-08-13T14:32:12.667 回答
3

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

于 2012-08-13T13:28:34.690 回答
3

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

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

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

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

于 2012-08-13T13:28:43.920 回答
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变量。

于 2014-11-10T05:06:26.557 回答
0

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

(sleep 1m && killall myfunction.sh) & # we schedule timeout 1 mn here
myfunction.sh
于 2012-08-13T13:46:53.277 回答