web-dev-qa-db-ja.com

bashのスレッド?

Bashスクリプトでスレッドを使用することは可能ですか? Javaにドライバクラスがあります。同時に複数のインスタンスを実行しようとしています。これを行う唯一の方法は、bashでスレッドを作成することですが、それでも可能かどうか確認してください。

33
auwall

Bashはスレッド自体をサポートしていませんが、次のように複数のJavaプロセスをバックグラウンドで起動できます。

Java myprog &
Java myprog &
Java myprog &

スレッド管理ユーティリティを備えたPythonまたはRubyを調べれば、それ以上のものは何でも、それぞれが完了するのを待って、出力/終了ステータスなどを収集できます。

編集waitを使用するための@CédricJulienからの提案を借用します。これは、より完全な例です。これを考えるとMyProg.Javaプログラム:

public class MyProg {
    public static void main(String[] args) {
        System.exit(Integer.parseInt(args[0]));
    }
}

次のように書くことができますbash-threads.shスクリプトを使用して、複数のインスタンスを同時に起動します。

#!/bin/bash
set -o errexit

Java MyProg 1 &
pid1=$!
Java MyProg 0 &
pid2=$!
Java MyProg 2 &
pid3=$!

wait $pid1 && echo "pid1 exited normally" || echo "pid1 exited abnormally with status $?"
wait $pid2 && echo "pid2 exited normally" || echo "pid2 exited abnormally with status $?"
wait $pid3 && echo "pid3 exited normally" || echo "pid3 exited abnormally with status $?"

その出力は次のとおりです。

pid1 exited abnormally with status 1
pid2 exited normally
pid3 exited abnormally with status 2
34
Steve Kehlet

一部の「bashスレッド」を起動することはできませんが、コマンドの後に&を使用するだけで、bashでサブプロセスを起動でき、バックグラウンドプロセスで起動します。

プロセスの起動後にwaitを呼び出して、プロセスが完了するのを待ちます。

これを試して

first_command &
second_command &

wait
31
Cédric Julien