shellのコマンドをtask登録してworkerに実行させる

別にGearmanでやる必要は無いし危険だしどのworkerが実行するかわからないから意味ないけど
別のマシンにshellのコマンドを実行させられる


client側

#!/usr/bin/env ruby
require 'rubygems'
require 'gearman'

c = Gearman::Client.new(['192.168.200.243:7003'])
taskset = Gearman::TaskSet.new(c)

cmd = ARGV.join(' ')
task_cmd = Gearman::Task.new('remotecmd', cmd)
task_cmd.on_complete{|stat|
  puts stat
}
taskset.add_task(task_cmd)
taskset.wait(100) # 100sec


worker側

require 'rubygems'
require 'gearman'

Gearman::Util.debug = true

w = Gearman::Worker.new(['localhost:7003'])

w.add_ability('remotecmd'){|cmd,job|
  puts cmd
  `#{cmd}`
}

while true do
  w.work
end
% ruby gearman-remotecmd-client.rb ls
1257764063
1259242737
4106454938_ab09a76a0e_b.jpg
4106455190_7164daa541.jpg
gearman
gearman-download-worker.rb
gearman-download-worker.rb~
gearman-eval-worker.rb
gearman-eval-worker.rb~
% ruby gearman-remotecmd-client.rb ls /
bin
boot
cdrom
dev
etc
home
initrd.img
initrd.img.old
lib
lost+found
media
mnt
opt
proc
root
sbin
selinux
srv
sys
tmp
usr
var
vmlinuz
vmlinuz.old
% ruby gearman-remotecmd-client.rb df
ファイルシステム           1K-ブロック    使用   使用可 使用% マウント位置
/dev/sda1             19734388   3683908  15048028  20% /
tmpfs                   383936         0    383936   0% /lib/init/rw
varrun                  383936       136    383800   1% /var/run
varlock                 383936         0    383936   0% /var/lock
udev                    383936       152    383784   1% /dev
tmpfs                   383936       128    383808   1% /dev/shm
lrm                     383936      2192    381744   1% /lib/modules/2.6.28-16-generic/volatile
.host:/              383647744 241258456 142389288  63% /mnt/hgfs
% ruby gearman-remotecmd-client.rb sudo halt