Re: [問題] 同時執行多個指令
ssh 有一個 -f 的選項可以讓 ssh 在背景執行, 但是如果你寫
成以下這樣:
cpur1=`ssh -f r1 cpu`
shell 為了等 ssh 執行完給它值, 好讓它可以存進變數 cpur1
裡, 因此即使下了 -f 也不會讓你背景執行.
有鑑於此, 我想你可能需要在 shell script 裡做 fork 的動作,
讓 20 個程序同時執行, 待每一個程序執行完後, 把結果用變數
回報給主程序, 但是 fork 之後的 process 無法互相傳遞變數.
所以有一個變通的方法, 請看以下的例子.
-------------------------------------------------------
#!/bin/sh
TMP=/tmp/def.txt
fake_fork() {
echo "$1=`ssh $2 cpu`" >>$TMP
}
# 清除 tmp 檔
echo > $TMP
# 跑20次的迥圈 i=1..20, 分別會執行以下的 fake_fork
# fake_fork cpur1 r1 &
# fake_fork cpur2 r2 & ... 以此類推至 20
i=1
while [ "$i" -le "20" ];do
fake_fork cpur$i r$i &
i=`expr $i + 1`
done
# 等20個process都執行完
wait
# 讀取變數 list
source $TMP
# 清掉暫存檔
rm -f $TMP
# 接下來, 可以運用 cpur1, cpur2, ... , cpur20 這些變數了
# 這邊的例子是將他們印出來
i=0
while [ "$i" -le "20" ];do
eval "echo $cpur$i"
i=`expr $i + 1`
done
----------------------------------------------------------
[追加說明]
1. 在呼叫 function 時, 在後面加一個 &, 即是fork另一個 process
來處理 function 裡的動作.
2. wait 不加任何參數時, 即為等全部 fork 出的子程序結束返回
3. $TMP 檔是為了存這些執行完後的結果, 每一個 fork 出來的子
程序執行完後, 會把結果用變數的型式寫進 $TMP 檔, 之後再用
source 讀出. 這樣做是因為父程序無法和子程序共用變數而使用
的變通方法(類似IPC)
※ 引述《kkarthur (aa)》之銘言:
: 請問一下,如果我有一隻小程式要利用ssh同時送到20台電腦執行
: 並把結果回存
: 如下:
: cpur1=`ssh r1 cpu`
: cpur2=`ssh r2 cpu`
: cpur3=`ssh r3 cpu`
: ....
: ....
: ....
: 因為執行cpu這個小程式需要一些時間,像上面的寫法
: 如果執行一次要花上1分鐘,加起來就要花上20*1=20分鐘
: 有沒有辦法能同時送出20個命令,只用花上1分鐘,就能得到結果呢?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 60.249.207.134
※ 編輯: phterry 來自: 60.249.207.134 (11/20 18:21)
推
11/20 20:06, , 1F
11/20 20:06, 1F
討論串 (同標題文章)
完整討論串 (本文為第 3 之 3 篇):
問題
4
9