如何使用超时命令与自己的功能?(How to use timeout command with a

2019-10-17 03:20发布

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

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

timeout 5 test

但是,调用此脚本时,似乎什么也不做。 外壳返回之后,我开始了。

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

Answer 1:

timeout似乎并没有成为一个内置命令bash ,这意味着它不能访问的功能。 你将不得不函数体移动到一个新的脚本文件,并把它传递给timeout作为参数。



Answer 2:

timeout需要一个命令,不能在外壳职能的工作。

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

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

这不是巨大的帮助,但足以说明这是怎么回事。



Answer 3:

一种方法是做

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

代替。 虽然你也可以砍了一些这样的:

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


Answer 4:

只要你在一个单独的脚本隔离你的函数,你可以这样来做:

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


Answer 5:

发现当试图达到这个自己,并从@ 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变量。



文章来源: How to use timeout command with a own function?