このようなコマンドが必要な場合は、継続的な統合ビルドスクリプトを開発しています。デフォルトでは、コマンドが終了する前に実行されるように設定されたタイムアウトでコマンドを開始する必要があり、コマンドがバックグラウンドでタイムアウトプロセスを開始した場合は、進行中のすべてのコマンドが待機せずにすぐに実行する必要があります。一種の非同期並行性です。
これが私が想像するものです:
timelimited --limit=10 'somecommand --someoptions'
someothercommand //This gets launched immediately once 'timelimited' is done creating the background process
答え1
timeout
と使用できない場合doalarm
(OS Xなど)、次のものを使用できますexpect
。
timeout() {
time=$1
# start the command in a subshell to avoid problem with pipes
# (spawn accepts one command)
command="/bin/sh -c \"$2\""
expect -c "set echo \"-noecho\"; set timeout $time; spawn -noecho $command; expect timeout { exit 1 } eof { exit 0 }"
if [ $? = 1 ] ; then
echo "Timeout after ${time} seconds"
fi
}
答え2
BASH FAQエントリー#68:「コマンドを実行してN秒後にコマンドを中断(タイムアウト)させる方法は?
最初実行中のコマンドがタイムアウトしたことを直接知っていることを確認してください。ここで説明されている方法は、一定時間が経過した後にコマンドを強制終了する「ハッキー」回避策です。正しく設定するコマンドは次のとおりです。いつも以下の選択肢よりも優れています。
コマンドが指定された時間以降に停止をデフォルトでサポートしていない場合、最良の選択肢は次のとおりです。停止するそしてアラーム。一部のLinuxディストリビューションでは、
timeout
tctバージョンをパッケージとして提供しています。最近のcoreutilsリリースには、GNUバージョンのタイムアウトも含まれています。
答え3
もう1つの可能性は、これを手動で行うことです。ただし、Ignacioが回答で提案したオプションが利用できない場合にのみこれを行います。
timeout_f () {
$1 &
sleep $2
kill $! # ends somecommand if still running
}
timeout_f 'somecommand --someoptions' 10 && #need 2 &'s
echo "forked.." # happens immediately