Re: [問題] 同時執行多個指令

看板Linux作者 (小風)時間14年前 (2009/11/20 17:49), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串3/3 (看更多)
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
文章代碼(AID): #1B1cOnAM (Linux)
文章代碼(AID): #1B1cOnAM (Linux)