Note: The Listed platform will permanently shut down December 31, 2026. Your data published on Listed will still be available in your personal Standard Notes account. Learn more

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