web-dev-qa-db-ja.com

複数のインスタンスでスクリプトを実行する方法は? (Ubuntuサーバー)

Ubuntuサーバーの複数のインスタンスでスクリプトを実行するにはどうすればよいですか?

たとえば、scanner.shという名前の長時間実行スクリプトを/usr/bin/に配置し、10個の並列インスタンスでスクリプトを実行したいとします。どうすれば並列タスクを開始できますか(そしてそれらに異なるフラグ/オプション/パラメーターを渡すことができます)?

インスタンスを停止するにはどうすればよいですか?

1
Raptor
#**parallel_scaller.sh**
# Script to async run scanner.sh
# USAGE: $> bash parallel_scanner.sh "FLAGS FOR INSTANCE 1" ... "FLAGS FOR INSTANCES 10"
$1=`echo $1 | sed 's/"//g'`
$2=`echo $1 | sed 's/"//g'`
$3=`echo $1 | sed 's/"//g'`
$4=`echo $1 | sed 's/"//g'`
$5=`echo $1 | sed 's/"//g'`
$6=`echo $1 | sed 's/"//g'`
$7=`echo $1 | sed 's/"//g'`
$8=`echo $1 | sed 's/"//g'`
$9=`echo $1 | sed 's/"//g'`
$10=`echo $1 | sed 's/"//g'`

bash scanner& $1 2>&1
bash scanner& $2 2>&1
bash scanner& $3 2>&1
bash scanner& $4 2>&1 
bash scanner& $5 2>&1
bash scanner& $6 2>&1
bash scanner& $7 2>&1
bash scanner& $8 2>&1
bash scanner& $9 2>&1
bash scanner& $10 2>&1

&タスクをバックグラウンドに配置します。 2>&1は、STDOUTをSTDERRにリダイレクトします。

プロセスを終了するには、次のように入力します。

$> ps aux | grep scanner
$> kill $PIDS
1
Tyler Maginnis

GNU Parallelを使用すると、次のようになります。

parallel scanner {} ::: "--flags --for --instance 1" "--for 2" "--for 3"

CPUごとに1つのジョブを生成します。停止するには、CTRL-Cを押すだけです。

GNU Parallelは一般的な並列処理機能であり、同じマシン上またはsshアクセスできる複数のマシン上でジョブを簡単に並列実行できます。多くの場合、forループを置き換えることができます。

4つのCPUで実行する32の異なるジョブがある場合、並列化する簡単な方法は、各CPUで8つのジョブを実行することです。

Simple scheduling

代わりに、GNU Parallelは、終了時に新しいプロセスを生成します。つまり、CPUをアクティブに保ち、時間を節約します。

GNU Parallel scheduling

インストール

GNU Parallelがディストリビューション用にパッケージ化されていない場合は、rootアクセスを必要としない個人インストールを実行できます。これを行うことで10秒で実行できます。

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

その他のインストールオプションについては、 http://git.savannah.gnu.org/cgit/parallel.git/tree/README を参照してください。

詳細

その他の例を参照してください: http://www.gnu.org/software/parallel/man.html

イントロビデオを見る: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

チュートリアルをウォークスルーします: http://www.gnu.org/software/parallel/parallel_tutorial.html

サポートを受けるためにメーリングリストにサインアップしてください: https://lists.gnu.org/mailman/listinfo/parallel

1
Ole Tange

提案された答えに加えて、私は次のコマンドを使用します。

Nohup ./scanner.py -flag1 flag1value -flag2 flag2value &

新しいインスタンスを作成します。実行中のすべてのscanner.pyインスタンスを表示するには、次を使用します。

ps aux | grep scanner.py

特定のインスタンスを強制終了するには、次を使用します。

kill -9 {PID}

ここで、{PID}ps auxコマンドから取得されます。例: kill -9 1234

0
Raptor

できればAnsibleのような構成管理システムを使い始めることを提案したいと思います。

これはPythonで書かれており、初心者にとっても、誰にとっても非常に使いやすいものです。

ドキュメントに従ってください http://docs.ansible.com/ そして始めましょう!

0
ihor_dvoretskyi