読者です 読者をやめる 読者になる 読者になる

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, in 
    time.sleep(3)
KeyboardInterrupt

結果のうち、1桁目がジョブの状態を表しており、 0, 3 が実行中、1が完了となる。上では、3秒ごとに状態を確認し、4回目で両方のジョブが完了していることが分かる。