Linuxでプログラムの実行時間を制限する方法は?

Linuxでプログラムの実行時間を制限する方法は?

それぞれpython simulate.py <parameter list>

私にとって必要なのは、プロセスを自動的に終了する一種の「ランタイム制約」コマンドです。Ctrl+Cしかし、プロセスがそれ自体正常に終了しない場合は、指定された時間以降に簡単な終了も機能すると思います。

もちろん、これらのスクリプトを直接書くこともできますが、誰かが私より先に書いたかどうか疑問ですpstime

答え1

潜在的なソリューション #1

使用timeoutコマンド:

$ date
Mon May  6 07:35:07 EDT 2013
$ timeout 5 sleep 100
$ date
Mon May  6 07:35:14 EDT 2013

timeoutしばらくしても停止しない場合は、コマンドと処理にガードを設定することもできます。kill

$ date
Mon May  6 07:40:40 EDT 2013
$ timeout -k 20 5 sleep 100
$ date
Mon May  6 07:40:48 EDT 2013

プロセスが停止してsleep 100から最大20秒待ってからまだ実行中の場合は、シグナルを送信timeoutします。kill

潜在的なソリューション #2

より危険ですが、別のアプローチは次のとおりです。

./myProgram &
sleep 1
kill $! 2>/dev/null && echo "myProgram didn't finish"

Stack Overflowの質問でこの技術を見つけました。Linuxでのプログラム実行時間の制限。具体的には回答

メモ:@mattdmが残したコメントによれば、上記のアプローチは、プロセスの後に新しいプロセスが開始されなかったと仮定しているため危険です。したがって、新しいPIDは割り当てられません。このため、このアプローチは使用しないでくださいが、ここではこの問題を解決するための一般的なアプローチへの参照のみを目的としています。このtimeout方法は、2つの方法のうちより良い選択です。

答え2

timeout私は以下より良いことを発見しましたtimelimit

これにはいくつかの利点があります。 1つは、ユーザーが「Ctrl + C」を押して実行を手動で中断できることです。

このtimelimitプログラムは Debian リポジトリにあります。

答え3

以下を使用して、CPU時間など、ulimit特にCPU時間を調整できます。

$ ulimit -t 60      # limit to 60 seconds
$ program

答え4

$BASHPIDBashはこの場合に利用可能なitという変数を使用します。たとえば、次のようになります。

#!/bin/bash
do_face() {
    local parent=$1
    echo $BASHPID > pid
    sleep 10
    echo "Killing parent $parent"
    kill $parent
}

ME=$BASHPID
eval $(echo "do_face $ME &")
sleep 20 && kill $(cat pid) && echo "killed child $(cat pid)"
exit 1

sleep代わりに、呼び出し時にパラメータを変更し、do_face()子が家事をするのに時間がかかりすぎるとどうなるかを確認できます。 sleep 呼び出しを実行可能ファイル呼び出しに変更すると、長すぎるとスクリプトはその呼び出しを終了します。この例では、秒単位で制限されます。パラメータを実装すると、呼び出すことができる単純なスクリプトになり、一括で呼び出すことも、別のスクリプトで呼び出すこともできます。各同時プロセスのpidファイルを処理することは、異なるサブディレクトリを使用して処理する必要がある問題です。10010do_face()20

注:GNU Linuxでは、10分の1秒間、スリープモードなどのsleep浮動小数点パラメータを使用できます。sleep 0.1

関連情報