それぞれpython simulate.py <parameter list>
。
私にとって必要なのは、プロセスを自動的に終了する一種の「ランタイム制約」コマンドです。Ctrl+Cしかし、プロセスがそれ自体正常に終了しない場合は、指定された時間以降に簡単な終了も機能すると思います。
もちろん、これらのスクリプトを直接書くこともできますが、誰かが私より先に書いたかどうか疑問ですps
。time
答え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
$BASHPID
Bashはこの場合に利用可能な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ファイルを処理することは、異なるサブディレクトリを使用して処理する必要がある問題です。100
10
do_face()
20
注:GNU Linuxでは、10分の1秒間、スリープモードなどのsleep
浮動小数点パラメータを使用できます。sleep 0.1