我想要一個簡單的測試shell腳本,它並行啓動一個程序N次,並將每個不同的輸出保存到不同的文件中。我已經開始並行啓動程序並保存輸出,但我怎樣才能只保留不同的輸出?另外我怎樣才能讓echo DONE!
表明結束?用於測試的shell腳本
#!/bin/bash
N=10
for((i=1; j<=$N; ++i)); do
./test > output-$N &
done
echo DONE!
我想要一個簡單的測試shell腳本,它並行啓動一個程序N次,並將每個不同的輸出保存到不同的文件中。我已經開始並行啓動程序並保存輸出,但我怎樣才能只保留不同的輸出?另外我怎樣才能讓echo DONE!
表明結束?用於測試的shell腳本
#!/bin/bash
N=10
for((i=1; j<=$N; ++i)); do
./test > output-$N &
done
echo DONE!
你需要使用內建命令wait。
等待[N ...]
等待每個指定的進程,返回它的終止狀態。每個n可以是進程ID或工作規範;如果給出了工作規範,則等待該作業管道中的所有進程。如果沒有給出n,則等待所有當前活動的子進程,返回狀態爲零。如果n指定不存在的進程或作業,則返回狀態爲127.否則,返回狀態爲最後進程或作業等待的退出狀態。
你可以指定你的工作爲%1
,%2
,...:
wait %1 %2 %3 ...
但只要你有沒有其他的子進程,你可以不帶參數的使用;然後它會等待所有的子進程來完成:
for ...; do
...
done
wait
echo "All done!"
你的另外一個問題,如何保持唯一不同的輸出,是有點麻煩。你究竟是什麼意思 - 不同於什麼?如果你有一個底線,你可以這樣做:
for ...; do
if diff -q $this_output $base_output; then
# files are identical
rm $this_output
fi
done
如果你想保留的所有獨特的輸出,該算法是一個稍微複雜一些,很明顯,但你仍然可以使用diff -q
來測試相同的輸出。
爲了讓你的輸出表明,所有的過程都完成後,你需要調用wait
:
#!/bin/bash
N=10
for((i=1; j<=$N; ++i)); do
./test > output-$N &
done
wait # wait until all jobs are finished
echo DONE!
隨着GNU並行http://www.gnu.org/software/parallel/你可以這樣做:
/tmp/test > base; seq 1 10 | parallel -k "/tmp/test >output-{}; if diff -q output-{} base; then rm {}; fi" ; echo DONE
GNU並行是其他的東西是有用的。觀看介紹視頻到GNU Parallel:http://www.youtube.com/watch?v=OpaiGYxkSuQ
正如有人在一個現在被刪除的答案中指出的,'j'應該是'i'。同樣''output-$ N''將用每次測試覆蓋相同的文件「output-10」。我很確定你想'output- $ i',所以你有十個不同的輸出文件。 – 2010-06-02 21:54:46