コマンドの行が別々のプロセスに分散される簡単な並列化を実装しようとしています。その目的のために、私は私が名前を付けたこのスクリプトを書きましたjobsel
:
(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...
だから私はこれを機能させました。しかし、これをセキュアシェルで実行したときはat
、バックグラウンドで実行しました(各行をで終了します&
)。次に問題があります。8行入力すると21プロセスが始まりました!ps -AFH
同一のコマンドと異なるpIDを持つ印刷プロセス。すべての作業プロセスは同じレベルで、initの直下にありました。私のプログラムはとにかく子プロセスを作成しません。
困惑して、echo 0 >> out
スクリプトを試してみたところat
、出力に重複した行が含まれていました。それでも信じがたいことであり、同時追加が異常の原因である可能性があると考え、他の方法を使用して、一部の行が複数回実行されたことを確認しました。
at
さらに、すべてがターミナルで実行されたとき、またはワーカープロセスごとに個別のジョブを作成したときに、そのような異常はありませんでした。
しかし、これはどのように起こりますか?スクリプトに何か問題がありますか?at/atd
バグはありますか?