我試圖實現簡單的並行化,其中命令行分佈在不同的進程中。爲此目的,我寫這個劇本,我命名爲jobsel
:使用bash腳本分配命令行
(only "#! /bin/bash" and help message is omitted)
slots=$1
sel=$2
[[ $slots -gt 0 ]] || die_usage
[[ $sel -lt $slots ]] || die_usage
i=0
while read line
do
((i % slots == sel)) && eval $line
i=$((i + 1))
done
# in case the last line does not end with EOL
if [[ $line != "" ]]; then
((i % slots == sel)) && eval $line
i=$((i + 1))
fi
我把eval
因爲我不能沒有它使用重定向或管道中的命令。
當我運行這個喜歡$HOME/util/jobsel 22 0 < cmds
在遊戲機模擬器時cmds
是包含有越來越多像echo 0 >> out
線,它輸出,符合市場預期,在單獨的行0, 22, 44...
文件。目前很好。
所以我把這個工作。但是當我通過安全shell運行這個時,我通過帶背景的at
運行它(每行以&
結尾)。然後有一個問題。當我輸入8行時,開始了21個進程! ps -AFH
使用相同的命令和不同的pID打印過程。所有的工作流程都在同一級別,直接在初始階段。無論如何,我的程序不會創建子進程。
困惑,我試着echo 0 >> out
腳本通過at
然後輸出包含重複的行。仍然很難相信,並認爲同時追加可能會導致異常,我用其他方法來確認某些行多次運行。
此外,還有當一切都在終端已運行沒有這樣的異常或當我創建的每個工作進程獨立at
工作。
但是這怎麼發生?我的腳本有問題嗎? at/atd
有一些錯誤嗎?
而不是'[$((I%插槽))當量$ SEL]''做((I%插槽== SEL))'。請參見[流程管理](http://mywiki.wooledge.org/ProcessManagement)和[BashFAQ/050](http://mywiki.wooledge.org/BashFAQ/050)。 – 2012-07-19 08:17:38
你有沒有考慮過使用[GNU parallel](http://www.gnu.org/software/parallel/)? – 2012-07-19 08:44:20
@DennisWilliamson謝謝。我正在申請編輯。 – h2kyeong 2012-07-19 09:05:15