mapr 介紹

mapr 是一個非同步,批次執行指令的程式。擁有以下特點:

  • 非同步執行指令
  • 可以指定同時執行指令的數目
  • 指令執行失敗時,不在執行下一個指令
  • 能夠取得過去執行程式的結果作為這個指令的輸入(過去結果儲存在檔案裡面)
  • 能夠從檔案、指令執行結果、標準輸入做為指令參數
  • 能夠自動產生暫時檔案或是 uuid 作為指令參數

使用情境

  • 檢查特定主機的特定路徑是否有檔案,有檔案則顯示主機名稱
mapr -f '@a=hosts' 'ssh @a ls /somepath/somefile' 'echo @a' --last --no-header

上述指令執行從檔案讀取主機名稱(一行一個主機名稱),之後透過 ssh 指令檢查 /somepath/somefile 路徑是否存在,
如果存在則執行 echo 指令,印出主機名稱。如果路徑不存在,則不會執行 echo 指令。
@a會被替換成檔案hosts裡面的每一行。檔案有 n 行,則執行 n 次。

  • 刪除 OpenStack 下 project 所有的 volumes
mapr -c '@a=openstack volume list --format value --column ID' 'openstack volume delete @a'

先從 openstack volume list --format value --column ID 取得所有要刪除的 volume id。之後在一個一個傳進 openstack volume delete 做刪除動作。

上面指令與 openstack volume list --format value --column ID|xargs -L 1openstack volume delete 指令相似。但是透過 mapr 可以同時刪除多個 volume

  • 刪除 OpenStack 下 project 下,放在特定主機的 volume
mapr -c '@a=openstack volume list --format value --column ID' 'openstack volume show @a' 'grep @stdout1 host1' 'openstack volume delete @a'

先從 openstack volume list --format value --column ID 取得所有要刪除的 volume id。之後透過 openstack volume show 看 volume 詳細資訊。
該指令的 stdout 會存放在 @stdout1這個檔案裡面。方便後來的指令使用。grep @stdout1 host1 指令檢查檔案 @stdout1(由第一個指令openstack volume show @a產生的)
是否有包含 host1 這個字串。如果有的話,則執行下一個指令。刪除該 volume。

  • 建立檔案 file1~file99
mapr -l '@a=1-100' 'touch file@a'
  • 在 OpenStack 上建立 100 個 vm,vm 建立成功後立刻刪除
mapr -w 10 -l '@b=1-101' -u @a 'openstack server create --image image --network n1 --flavor f1 test-@a' 'openstack server delete test-@a'

上述指令會建; 100 個 vm ,vm 名字有 test- 這個 prefix,後面是 uuid。有 10 個 worker,指同時執行十個指令(可能是建立或是刪除)。
總共會建立100個 vm,但是至多有 10 vm 同時存在在系統。一個 worker 執行完建立與刪除 vm 後,才會在執行下一個建立與刪除vm的指令。

  • 透過 multiprocess 進行 grep 搜索
mapr -w 20 -c '@a=ls|xargs -L1' 'grep -R @a' --no-header

ls看到的目錄丟給 grep -R 做搜索,至多有 20 的 process 同時處理。預設 grep 執行失敗的結果不會顯示在畫面上。

  • 找出死掉的程序
./mapr -f '@a=hosts' -t @f1 -t @f2 -t @f3 --last \
  "ssh @a ps aux|tail -n +2 |awk '{print \$2,\$8}'|grep D|awk '{print \$1}'|tee @f1" \
  "sleep 3s" \
  "ssh @a ps aux|tail -n +2 |awk '{print \$2,\$8}'|grep D|awk '{print \$1}'|tee @f2" \
  "grep -f @f1 @f2|tee @f3" "cat @f3|ssh @a xargs ps -p"
  • 顯示 kern.log 檔案裡面,每小時 audit 出現的次數
mapr -l '@a=1-10' "date '+%b %d %H:' -d '-1 days @a hours'" 'grep "`cat @stdout1`" kern.log|grep audit|wc -l' 'echo `cat @stdout1` `cat @stdout2`' --last --no-header|sort -u

You'll only receive email when they publish something new.

More from kjelly
All posts