csh 배열/명령을 대체하려면 gnu 병렬을 사용하십시오.

csh 배열/명령을 대체하려면 gnu 병렬을 사용하십시오.

첫째, 예, 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>

관련 정보