45

Linux サーバーのシェルで実行する必要がある 200 個のコマンドのリスト/キューがあります。

一度に最大 10 個のプロセスを (キューから) 実行したいだけです。一部のプロセスは完了までに数秒かかりますが、他のプロセスはそれよりもはるかに時間がかかります。

プロセスが終了したら、次のコマンドをキューから「ポップ」して実行したいと考えています。

この問題を解決するコードを持っている人はいますか?

さらに詳しく:

ある種のキューに、実行する必要がある 200 個の作業があります。一度に最大 10 個の作業を実行したいと考えています。スレッドが作業を終了すると、キューに次の作業を要求する必要があります。キューに作業がなくなった場合、スレッドは終了するはずです。すべてのスレッドが死んだら、すべての作業が完了したことを意味します。

私が解決しようとしている実際の問題はimapsync、200 個のメールボックスを古いメール サーバーから新しいメール サーバーに同期することです。メールボックスが大きく同期に時間がかかるユーザーもいれば、メールボックスが非常に小さく同期が速いユーザーもいます。

4

12 に答える 12

45

シェルでは、xargs並列コマンド処理をキューに入れるために使用できます。たとえば、常に 3 つのスリープを並行して実行し、それぞれ 1 秒間スリープし、合計 10 回のスリープを実行するには、次のようにします。

echo {1..10} | xargs -d ' ' -n1 -P3 sh -c 'sleep 1s' _

そして、合計で 4 秒間スリープします。名前のリストがあり、実行されたコマンドに名前を渡したい場合は、再び 3 つのコマンドを並行して実行します。

cat names | xargs -n1 -P3 process_name

コマンドprocess_name aliceなどを実行process_name bobします。

于 2009-01-21T03:53:00.787 に答える
41

make と make -j xx コマンドを使用してこれを行うことができると思います。

おそらく、このようなメイクファイル

all : usera userb userc....

usera:
       imapsync usera
userb:
       imapsync userb
....

make -j 10 -f makefile

于 2009-01-21T03:58:50.900 に答える
28

パラレルはまさにこの目的のために作られています。

cat userlist | parallel imapsync

他のソリューションと比較したParallelの優れた点の 1 つは、出力が混合されないようにすることです。並列で行うtracerouteと、たとえば次のようにうまく機能します。

(echo foss.org.my; echo www.debian.org; echo www.freenetproject.org) | parallel traceroute
于 2010-01-27T17:00:56.533 に答える
13

この種のジョブのために、PPSSが記述されています:並列処理シェルスクリプト。この名前のグーグルとあなたはそれを見つけるでしょう、私はlinkspamしません。

于 2009-03-10T00:31:35.383 に答える
3

Pythonでは、次を試すことができます:

import Queue, os, threading

# synchronised queue
queue = Queue.Queue(0)    # 0 means no maximum size

# do stuff to initialise queue with strings
# representing os commands
queue.put('sleep 10')
queue.put('echo Sleeping..')
# etc
# or use python to generate commands, e.g.
# for username in ['joe', 'bob', 'fred']:
#    queue.put('imapsync %s' % username)

def go():
  while True:
    try:
      # False here means no blocking: raise exception if queue empty
      command = queue.get(False)
      # Run command.  python also has subprocess module which is more
      # featureful but I am not very familiar with it.
      # os.system is easy :-)
      os.system(command)
    except Queue.Empty:
      return

for i in range(10):   # change this to run more/fewer threads
  threading.Thread(target=go).start()

未テスト...

(もちろん、python 自体はシングル スレッドです。ただし、IO を待機するという点では、複数のスレッドの利点が得られるはずです。)

于 2009-01-21T03:59:01.007 に答える
3

Python を使用する場合は、Twistedを使用することをお勧めします。

具体的にはツイストランナー

于 2009-01-21T02:59:40.830 に答える
2

https://savannah.gnu.org/projects/parallel(gnu parallel)とpsshが役立つ場合があります。

于 2011-08-29T22:30:14.210 に答える
-3

並列の意味を詳しく説明できますか? エントリが2回選択されないように、キューに何らかのロックを実装する必要があるようです。コマンドは1回だけ実行されます。

ほとんどのキュー システムはごまかしをします。巨大な ToDo リストを作成し、たとえば 10 個の項目を選択して作業し、次の 10 個の項目を選択するだけです。並列化はありません。

詳細を教えていただければ、きっとお役に立てると思います。

于 2009-01-21T03:08:43.060 に答える