独自の関数でtimeoutコマンドを使用したいと思います。例:
#!/bin/bash
function test { sleep 10; echo "done" }
timeout 5 test
しかし、このスクリプトを呼び出すと、何もしないようです。シェルは起動直後に戻ります。
これを修正する方法はありますか、またはタイムアウトを独自の関数で使用できませんか?
1つの方法は
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
コマンドが必要で、シェル関数では動作しません。
残念ながら、上記の関数には実行可能ファイルとの名前の衝突があり、すぐに終了する/usr/bin/test
ため、混乱を引き起こしています。/usr/bin/test
関数の名前を (say) に変更すると、次の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
、そのサブシェル環境を取得してスクリプトをソースし、実行したい関数を継承することが秘訣でした。2 番目のトリックは、ある程度読みやすくすることでした...これがthisfile
変数につながりました。
関数を別のスクリプトに分離する場合は、次の方法で実行できます。
(sleep 1m && killall myfunction.sh) & # we schedule timeout 1 mn here
myfunction.sh