まず、はい、Solarisシステムのcshにロックされているので、これを行うことはできません。申し訳ありません。
foreachループを使用して実行中のレポートバッチがあります。これでシングルスレッドで実行され、GNU並列処理でスピードアップしたいと思います。私は2つの異なるアプローチを試しましたが、それぞれの問題に遭遇しました。
これは私の現在のバージョンです。
if( $#argv <= 1) then
#Get today's date
set LAST = `gdate +%Y-%m-%d`
else
#use date passed in parameter
set LAST=`echo $2 | tr -d _/`;
endif
if( $#argv == 0 ) then
#default to 15 day lookback
set COUNT = 15
else
#otherwise use parameter
set COUNT = $1
endif
@ LCOUNT = $COUNT + 1 #increment by one to exclude $LAST date
#get starting date by subtracting COUNT (now incremented by 1)
set START = "`gdate --date='$LAST -$LCOUNT day' +%Y/%m/%d`";
#loop through dates, generate report string, and pipe to reportcli
foreach i (`seq $COUNT`)
set REPDATE = "`gdate --date='$START +$i day' +%Y/%m/%d`";
set FILEDATE = "`gdate --date='$START +$i day' +%Y%m%d`";
echo "runf reportname.rep -ps "$REPDATE" -pe "$REPDATE" -o report_"$FILEDATE".csv" \
| reportcli <cli params here>
end
それで、並列に動作させたいのですが、ご覧のようにコマンド拡張/交換をたくさんしています。
Reportcliに渡す文字列の配列を作成するなど、いくつかの他の操作を試しましたが、正しく機能させる方法がわかりません。
私の考えには2つのオプションがあります。
A)1行の大きな行(gdateコマンドの置き換えが機能するには、すべての引用の問題を解決する必要があります):
`seq $COUNT` | parallel reportcli <cli params> < "runf reportname.rep -ps \
`gdate --date='$START +{} day' +%Y/%m/%d` -pe `gdate --date='$START +{} day' +%Y/%m/%d` \
-o report_`gdate --date='$START +${} day' +%Y%m%d`.csv"
B)csh配列を事前組み立ててから、その配列を拡張して(エコー?を使用して)並列にパイプを試みます。
set CMDLIST
foreach i (`seq $COUNT`)
set REPDATE = "`gdate --date='$START +$i day' +%Y/%m/%d`";
set FILEDATE = "`gdate --date='$START +$i day' +%Y%m%d`";
set CMDLIST = ($CMDLIST:q "runf reportname.rep -ps "$REPDATE" -pe "$REPDATE" \
-o report_"$FILEDATE".csv")
end
私はこれを行い、各要素を取り戻すことができるので、私の配列は大丈夫であることを知っています。
foreach j ($CMDLIST:q)
echo $j
end
しかし、cshで動作させる方法がわかりません。
echo $CMDLIST | parallel --pipe "reportcli <cli params here>"
よろしくお願いします! !
答え1
スクリプトを作成してください。 GNU Parallelで呼び出す:
[... set $START and $COUNT ...]
seq $COUNT | parallel my_script.csh $START {}
my_script.csh:
#!/bin/csh
set START = $1
set i = $2
set REPDATE = "`gdate --date='$START +$i day' +%Y/%m/%d`";
set FILEDATE = "`gdate --date='$START +$i day' +%Y%m%d`";
echo "runf reportname.rep -ps "$REPDATE" -pe "$REPDATE" -o report_"$FILEDATE".csv" \
| reportcli <cli params here>