첫째, 예, Solaris 시스템의 csh에 잠겨 있으므로 이에 대해 할 수 있는 일은 없습니다. 죄송합니다.
foreach 루프를 사용하여 실행 중인 보고서 일괄 처리가 있습니다. 이제 단일 스레드로 실행되며 GNU 병렬 처리를 통해 속도를 높이고 싶습니다. 나는 두 가지 다른 접근 방식을 시도했지만 각각의 문제에 부딪혔습니다.
이것은 내 현재 버전입니다.
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에 전달할 문자열 배열을 만드는 것을 포함하여 몇 가지 다른 작업을 시도했지만 제대로 작동하도록 하는 방법을 모르겠습니다.
내 생각에는 두 가지 옵션이 있습니다.
A) 한 줄의 큰 줄(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>