bash スクリプトで実行中の jar ファイルを 5 分後に停止し、次のファイルを開始するにはどうすればよいでしょうか?

bash スクリプトで実行中の jar ファイルを 5 分後に停止し、次のファイルを開始するにはどうすればよいでしょうか?

次のように異なるパラメータを持つ jar ファイルを実行する必要があります。

#!/bin/bash
cd /Users/hawkarhama/Desktop/RUN 
echo $(java -jar IPM.jar 0 20 3 sign.txt)
echo $(java -jar IPM.jar 1 20 3 sign.txt)
echo $(java -jar IPM.jar 2 20 3 sign.txt)

たとえば、2 番目のスクリプトに 5 分以上かかった場合は、それを停止して次のスクリプトに進みます。したがって、実行中の各 jar の最大時間は 5 分です。それより短い時間であれば問題ありませんが、1 つのスクリプトの実行時間がそれより長くなると、スクリプトは次のスクリプトに進む必要があります。

答え1

これは bash 4 以降で動作するはずです:

#!/bin/bash
cd /Users/hawkarhama/Desktop/RUN 
( cmdpid=$BASHPID; (sleep 300; kill $cmdpid ) & exec java -jar IPM.jar 0 20 3 sign.txt )
( cmdpid=$BASHPID; (sleep 300; kill $cmdpid ) & exec java -jar IPM.jar 1 20 3 sign.txt )
( cmdpid=$BASHPID; (sleep 300; kill $cmdpid ) & exec java -jar IPM.jar 2 20 3 sign.txt )

以前のバージョンの場合:

#!/bin/bash
cd /Users/hawkarhama/Desktop/RUN 
bash -c '(sleep 300; kill $$) & exec java -jar IPM.jar 0 20 3 sign.txt'
bash -c '(sleep 300; kill $$) & exec java -jar IPM.jar 1 20 3 sign.txt'
bash -c '(sleep 300; kill $$) & exec java -jar IPM.jar 2 20 3 sign.txt'

純粋なJavaバージョンを少し検索した後、私は見つけたこれ:

ScheduledExecutorService executor = Executors.newScheduledThreadPool(2); 
final Future handler = executor.submit(new Callable(){ 
     DoStuffHere();
});
executor.schedule(new Runnable(){
     public void run(){
         handler.cancel();
     }      
}, 5*60*1000, TimeUnit.MILLISECONDS);

答え2

システムにtimeoutコマンドがある場合は、次のように使用できるはずです。

timeout 300s java -jar IPM.jar 0 20 3 sign.txt

関連情報