同時執行多個指令 - Linux

Lucy avatar
By Lucy
at 2009-11-20T17:49

Table of Contents

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分鐘,就能得到結果呢?


--
Tags: Linux

All Comments

George avatar
By George
at 2009-11-24T06:05
感謝~~很詳細的說明

輕量級的系統(for小筆電hp 2133)

Tracy avatar
By Tracy
at 2009-11-20T17:08
※ 引述《guezt ()》之銘言: : ※ 引述《DRLai (蘇打)》之銘言: : : 最近想幫電腦找個新的作業系統 : : 無奈一直找不到合適的 : : 電腦:HP mini-note 2133 ( CPU為via ) : : LXDE個人覺得速度符合需求,可惜他到了桌面畫面會花掉 : : 不知道還有哪 ...

我想租一個linux虛擬主機

David avatar
By David
at 2009-11-20T16:38
我知道 這問題似乎不應該在這邊問 我但想這邊的人應該比較了解吧 我想租一個run linux 的虛擬主機 可以使用 ssh 登入 也可以自己透過 yum 來安裝程式 當我把我的系統 玩爛時 有另外的一個介面 可以 讓我的主機 reset 回到 最基本的狀態 可以請先進推薦一下嗎 盡量年租 ...

紀錄硬碟使用狀態是否在待命中

Steve avatar
By Steve
at 2009-11-20T15:04
直覺的想法是用排程執行 hdparm -C 把結果印到檔案中 但現在遇到了問題,請教各位前輩是否有類似的經驗 corntab排程執行hdparm時導向符號(andgt;andgt;)不能印出資訊 直接在console hdparm -C /dev/sda andgt;andgt; test.txt 可以 ...

超級新手的苦惱

Harry avatar
By Harry
at 2009-11-20T14:40
最近才因為自己的 NoteBook 想重灌 XP 但驅動程式搞不定 所以就找了 ubuntu 9.10 來玩玩 小弟其實在一、兩年前就碰過 ubuntu 版本好像是 ubuntu 6.X 吧! 那時因為電腦爛 跑不動肥肥的 XP 所以想說往企鵝系列發展看看 而那時 烏奔吐 正夯 ...

ibus @ ubuntu 9.10

Leila avatar
By Leila
at 2009-11-20T10:25
最近安裝 Ubuntu 9.10 因為預設安裝輸入method是 Ibus 所以想說就用用看 ibus + chewing (新酷音) 當我中文輸入法 但今天使用新酷音輸入法的時候 輸入法內的注音完全跑掉 就是假如我想打 注音 『ㄅ』 但他會打出注音 『ㄒ』 每個注音符號的位置全部跑掉 = ...