Func: Fedora Unified Network Controller を使ってみた(5)
Funcにはasyncというオプションがあるのだが、これを設定すると同時に複数ジョブ(複数サーバーに対して)を実行することが出来、 依存性が無い複数のジョブを同時に実行するために利用出来る。
実際に1つのノードで、複数ジョブを並列で行わせてみた。
import func.overlord.client as fc import time client = fc.Client("fedora-virt2.jp.example.org", nforks=10, async=True) job1=client.command.run("/bin/su -c 'pg_dump postgres > /tmp/aaa; ' -l postgres") job2=client.command.run("sleep 10; /bin/su -c 'pg_dump postgres > /tmp/bbb; ' -l postgres") while True: print client.job_status(job1) print client.job_status(job2) time.sleep(3)
asyncを指定するには、 fc.Clientのコンストラクタで、 async=True を指定するだけである。 こうしておくと、 command.run を使った際に返り値に、 ジョブ番号を表す文字列がもらえるので、 client.job_status(文字列) でその時々のジョブ実行状況が分かるようになる。
実際に実行してみるとこんな感じになった。
[root@fedora-virt2 tmp]# python bbb.py (0, -1) (0, -1) (1, {'fedora-virt2.jp.example.org': [0, '', '']}) (3, {}) (1, {'fedora-virt2.jp.example.org': [0, '', '']}) (3, {}) (1, {'fedora-virt2.jp.example.org': [0, '', '']}) (3, {}) (1, {'fedora-virt2.jp.example.org': [0, '', '']}) (3, {}) (1, {'fedora-virt2.jp.example.org': [0, '', '']}) (1, {'fedora-virt2.jp.example.org': [0, '', '']}) (1, {'fedora-virt2.jp.example.org': [0, '', '']}) (1, {'fedora-virt2.jp.example.org': [0, '', '']}) ^CTraceback (most recent call last): File "bbb.py", line 11, intime.sleep(3) KeyboardInterrupt
結果のうち、1桁目がジョブの状態を表しており、 0, 3 が実行中、1が完了となる。上では、3秒ごとに状態を確認し、4回目で両方のジョブが完了していることが分かる。