특정 변수 이름의 각 개별 인스턴스에 대해 명령을 병렬로 실행해야 합니다. 변수가 4개일 수도 있고 100개일 수도 있습니다. 예를 들어 다음과 같은 특정 데이터 세트가 있다고 가정해 보겠습니다.
datanames='KQPW KMMX KMKO KZAO'
서로 병렬로 실행될 각 프로세스에 대해 프로세스를 실행해야 합니다. 즉, KQPW에 대해 process1을 실행해야 하고, KMMX에 대해 process1을 실행해야 하는 등의 작업이 수행됩니다. Process1에는 변수 이름을 기반으로 한 입력이 필요합니다.
내가 읽은 튜토리얼과 예비 조사를 통해 GNU '병렬' 명령을 설치했습니다. 모든 데이터 이름을 "run.txt"라는 텍스트 파일에 넣었습니다.
KQPW.csh
KMMX.csh
KMKO.csh
KZAO.csh
이러한 각 .csh
파일에는 process1에 대한 필수 입력으로 고유한 변수 이름을 사용하여 process1을 호출하는 명령이 포함되어 있습니다. 문제는 이 네 가지 명령을 동시에 실행하는 방법입니다. 나는 시도했다:
cat run.txt | parallel
그러나 아무 일도 일어나지 않았습니다. 어떤 아이디어가 있나요?
답변1
외부 도구를 사용하지 않고 병렬 설명을 기반으로 실행 스크립트를 빠르게 시연합니다.
#!/bin/bash
datanames='KQPW KMMX KMKO KZAO'
datanamesarray=($datanames)
for item in ${datanamesarray[@]}; do
( ./${item}.csh; sleep 10 ) &
done
echo waiting..
wait
echo done
waiting..
모든 하위 쉘이 병렬로 실행되기 때문에 이 명령을 실행한 후 10초의 지연이 발생합니다. wait
계속하기 전에 모든 하위 쉘이 종료될 때까지 상위 스크립트가 일시 중지됩니다. 여기서는 설명 목적으로 echo
, sleep
및 문이 wait
사용되었습니다.
답변2
당신이 하고 있는 일은 효과가 있을 것입니다. 이렇게 할 수 있는 경우:
$ KMMX.csh
그러면 GNU Parallel도 스크립트를 실행할 수 있어야 합니다. 첫 번째 디버깅 단계는 parallel
을 사용하여 실행하는 것입니다 --dry-run
. 그러면 무엇이 실행 중인지 알려줍니다.
cat run.txt | parallel --dry-run
그러나 귀하의 질문에는 저를 혼란스럽게 하는 몇 가지 사항이 있습니다.
- 질문 제목에 언급되어 있지만 스크립트를 대화형 쉘이라고
bash
부르지 만 스크립트 파일은 ?*.csh
bash
csh
- 파일을 의 디렉터리에 넣었다고 언급하지 않았지만
$PATH
경로(예: )를 사용하여 스크립트를 참조하지 않았습니다./KMMX.csh
. 이것이 작동하지 않는 이유를 설명합니다. 하지만 오류 메시지가 나타나야 합니다. chmod +x
당신은 파일을 소유하고 있다고 언급하지 않았습니다 . 이것이 작동하지 않는 이유를 설명합니다. 하지만 오류 메시지가 나타나야 합니다.
하지만 무엇보다도 당신이 필요 이상으로 일을 더 어렵게 만들고 있다는 점이 걱정됩니다. GNU Parallel은 템플릿에서 명령을 작성하도록 설계되었으며, *.csh
데이터 이름만 변경하면 파일도 템플릿에서 작성되는 것처럼 들립니다 .
내 생각엔 설정을 다음과 같이 변경할 수 있을 것 같습니다.
$ parallel doit {} ::: KQPW KMMX KMKO KZAO
doit
데이터 이름을 매개변수로 사용하는 스크립트/함수는 어디에 있습니까?
빠른 소개를 위해 소개 비디오를 시청하는 것이 좋습니다.http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1그런 다음 옵션 목록 뒤의 예를 살펴보세요(LESS=+/EXAMPLE:man 병렬 사용). 이를 통해 GNU의 병렬 기능에 대한 아이디어를 얻을 수 있습니다. 그런 다음 이 튜토리얼(manparallel_tutorial)을 탐색하는 데 몇 시간을 보내십시오.
당신의 명령줄은 당신을 좋아할 것입니다.