2014-10-02 5 views
1

xargs에 의해 생성 된 여러 병렬 프로세스로 텍스트 파일을 처리하고 있습니다. 또한 각 프로세스의 stdout을 별도의 로그 파일로 캡처해야합니다. 다음은 각 프로세스의 출력이 하나의 파일로 인터리브 된 예입니다. 원하는 것은 아닙니다.Bash : 여러 xargs 병렬 프로세스에서 로그 파일을 분리하기 위해 stdout을 로깅합니다.

이상적으로, 각각의 로그는, 즉, 그 파일 1, 파일 라인 번호로 넘버링한다 로그 -2- 등

cat inputfile.txt | xargs -n 1 -P 8 ./myScript.sh | tee logfile 

가능한 외부 래퍼 스크립트 않도록 좋겠지 그러나 myScript를 here 문서로 래핑하는 방법이 있다면 작동 할 것입니다.

+1

myScript.sh 내부에서'exec> logfile - $$'또는 일부를 수행 하시겠습니까? 기본적으로 스크립트는 'xargs'가 시도하는 것보다는 로깅을 제어합니다. – bishop

답변

1

이 시도 :

nl inputfile.txt | xargs -n 2 -P 8 sh -c './myScript.sh "$1" > logfile-$0' 

이는 자신의 라인에 inputfile.txt의 각 인수를 가정하고 공백을 포함하지 않는다. nl 명령은 각 행의 번호를 지정하며, 각 인수는 고유 한 번호로 쌍입니다. xargs 명령은 두 개의 인수를 취합니다. 첫 번째는 행 번호이고 두 번째는 inputfile.txt의 해당 행이며 두 번째 인수는 sh입니다. sh 명령은 인수를 사용하여 출력 파일 이름과 인수를 myScript.sh에 각각 생성합니다.

+0

''$ 1''이 아니라 '$ 1''이 아니라 올바른 아이디어입니다. –

+0

'xargs'가 공백에서 인수를 나눕니다 때문에 차이가 없을 지 모르지만'inputfile.txt'가 인수를 인용했을 수도 있습니다. –

+0

@ 로스, 영리한 해결책. 또한 로그 파일 외에도 화면 출력을 원합니다. 그것은 작은 변화와 함께 작동하는 것 : nl inputfile.txt | xargs -n 2 -P 8 sh -c './myScript.sh "$ 1"| tee logfile- $ 0 ' – Steve

2

대신 GNU 병렬를 사용할 수와 -k 옵션은 단일 로그 파일에 순서대로 출력을 유지하기 위해 :

cat input | parallel -k ./myScript.sh > file.log 

당신은 parallel-j 8을 추가 할 수 있습니다 바쁜 8 개 코어를 유지하지만 계속됩니다 어쨌든 기본적으로 모든 코어가 사용 중입니다.

+0

소스를 GNU 병렬로 보았습니까? 쥐 둥지를 좋은 조직의 모델처럼 보이게 만듭니다. –

+0

@CharlesDuffy 실제로 읽었습니다. 읽기는 힘들지만 동의합니다. 경험할 때마다 사용할 때마다 치료법이 적용됩니다. 나는 또한 리눅스 커널을 읽기가 너무 어렵다고 생각한다. :-) –

+0

@CharlesDuffy 개선 된 기능은 현재 기능을 해치지 않는 한 항상 환영한다. –