私がここでやっていることは少し複雑なので、理解できるほど十分に説明できることを願っています。 tldrバージョンは、ファイルから10行を読み取った後、そのファイルの入力に基づいてスクリプトを実行したいものです。完了すると、ファイルが完成するまで次のステップ10に進み、終了します。
これは長い話です。ニュースグループのいくつかのアーカイブを実行しようとしています。アーカイブしたい42227のニュースグループのリストがあります。私はUsenetサーバーから情報を抽出するためにsinntpアプリケーションを使用しています。 Pythonで書かれており、深刻なバグがあります。ニュースグループメッセージが失われると、再試行せずにコマンドが失敗します。
私の解決策はdownloader.shです。 sinntpが失敗すると、downloader.shは完了するまで強制的に再試行します。完了したら、永続保存のために出力ファイルの名前を変更して圧縮します(最終的にはarchive.orgに保存)。
ダウンローダ.sh:
#!/bin/bash
while getopts g: flag
do
case "${flag}" in
g) group=${OPTARG};;
esac
done
downloader() {
nntp-pull $group
}
until downloader; do
echo "restarting download" >&2
sleep 1
done
if [ $? -eq 0 ]; then
mv -v $group $group.mbox && zip -rm $group.mbox.zip $group.mbox
fi
今回は1つのニュースグループのみがダウンロードされます。また、メインニュースグループファイルを読み、downloader.shを並列に実行する2番目のスクリプトarchiver.shを作成しました。
アーカイバー.sh
#!/bin/bash
cat newsgroup_list_working.txt | parallel -j 10 ./downloader.sh -g {}
しかし、実際には動作しませんでした。複数回ダウンロードが中断され、新しいダウンロードは開始されません。ディスクやメモリが不足せず、CPU性能も100%ではありません。また、問題なく他のジョブを実行できるため、ディスクI / Oが最大値に達しません。ダウンロード速度が1MBが少し超えるほどなので、ネットワークには問題がないようです。
どんなアドバイスもありがとうございました!
答え1
コマンドごとに10個の引数を読み取ることができます。
cat file | parallel -N10 ./downloader.sh -g {5}
ここで、5はニュースグループ名を含む行です。
--dry-run
GNU Parallelに実行するコマンドを表示するように指示します。
cat file | parallel --dry-run -N10 ./downloader.sh -g {5}
-j 300%
正しいコマンドが表示されたら、各CPUスレッドが3つのジョブを並列に実行するように調整できます。