1

独自の関数でtimeoutコマンドを使用したいと思います。例:

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

timeout 5 test

しかし、このスクリプトを呼び出すと、何もしないようです。シェルは起動直後に戻ります。

これを修正する方法はありますか、またはタイムアウトを独自の関数で使用できませんか?

4

5 に答える 5

4

1つの方法は

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

timeoutbash関数にアクセスできないことを意味する組み込みコマンドではないようです。関数本体を新しいスクリプト ファイルに移動し、それをtimeoutパラメーターとして渡す必要があります。

于 2012-08-13T13:28:34.690 に答える
3

timeoutコマンドが必要で、シェル関数では動作しません。

残念ながら、上記の関数には実行可能ファイルとの名前の衝突があり、すぐに終了する/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、そのサブシェル環境を取得してスクリプトをソースし、実行したい関数を継承することが秘訣でした。2 番目のトリックは、ある程度読みやすくすることでした...これが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 に答える