我想将超时命令与自己的函数一起使用,例如:
#!/bin/bash
function test { sleep 10; echo "done" }
timeout 5 test
但是在调用这个脚本时,它似乎什么也没做。外壳在我启动后立即返回。
有没有办法解决这个问题,或者不能在自己的函数上使用超时?
一种方法是做
timeout 5 bash -c 'sleep 10; echo "done"'
相反。虽然你也可以破解这样的东西:
f() { sleep 10; echo done; }
f & pid=$!
{ sleep 5; kill $pid; } &
wait $pid
timeout
似乎不是bash
的内置命令,这意味着它无法访问函数。您必须将函数体移动到新的脚本文件中,并将其作为参数传递给timeout
。
timeout
需要一个命令,不能处理shell函数。
不幸的是,上面的函数与/usr/bin/test
可执行文件的名称冲突,这引起了一些混乱,因为/usr/bin/test
会立即退出。如果将函数重命名为 (例如) t
,您将看到:
brian@machine:~/$ timeout t
Try `timeout --help' for more information.
这不是很有帮助,但有助于说明正在发生的事情。
在尝试自己实现这一目标时发现了这个问题,并根据@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
变量。
如果你在单独的脚本中隔离你的函数,你可以这样做:
(sleep 1m && killall myfunction.sh) & # we schedule timeout 1 mn here
myfunction.sh