
다음과 같은 파일이 있습니다 processes.txt
.
process_1.sh
process_2.sh
process_3.sh
터미널에서 다음 명령을 실행하겠습니다.
cat processes.txt | xargs -L1 -P3 sh
executable_processes.sh
다음과 같은 스크립트가 있다면 차이점은 무엇입니까?
process_1 &
process_2 &
process_3 &
wait
여기서 process_1
, process_2
및 는 실행 권한이 있는 스크립트이지만 , process_3
및 와 동일한 작업을 수행하며 터미널에서 다음 명령을 실행했습니다.process_1.sh
process_2.sh
process_3.sh
sh executable_processes.sh
내 동료는 첫 번째 예(using xargs -L1 -P3
)가 세 개의 프로세스를 "실제로 병렬"로 실행하는 반면 두 번째 예( sh executable_processes.sh
using)는 &
세 개의 프로세스를 백그라운드 프로세스로 실행하지만 여전히 계속해서 백그라운드로 전송 process_1
한다고 말했습니다. 먼저 배경, 그 다음 process_2
배경, 그리고 process_3
다시 배경. 그래서 그는 내가 첫 번째 예를 사용하는 것을 선호했습니다. 하지만 첫 번째 접근 방식의 문제점은 xargs -L1 -P3
세 줄이 processes.txt
다음과 같은 경우 어떻게 사용하는지 모른다는 것입니다.
cat input_1.txt | process_1
cat input_2.txt | process_2
cat input_3.txt | process_3
processes.txt
다음과 같이 파일을 수정한다고 가정해 보겠습니다 .
input_1.txt | process_1
input_2.txt | process_2
input_3.txt | process_3
그런 다음 실행
cat processes.txt | xargs -L1 -P3 cat
오류가 발생합니다.
cat: '|': No such file or directory
cat input_1.txt
먼저 실행하고 출력을 process_1
기타 로 파이프할 수 있기를 원합니다 . 그러나 및 는 매개변수로 처리됩니다 input_1.txt
.|
process_1
cat
사용법이 &
서로 xargs -P
다르지 않다면 다음을 포함하는 스크립트를 실행하는 것이 더 합리적입니다.
cat input_1.txt | process_1 &
cat input_2.txt | process_2 &
cat input_3.txt | process_3 &
답변1
셸에서 실행되는 백그라운드 프로세스는 모두 병렬로 실행됩니다. 이를 실행하여 확인할 수 있습니다.
sleep 10 & sleep 10 & sleep 10 & wait
30초가 아니라 10초(또는 조금 더) 기다리게 됩니다.
그래서
process_1 < input_1.txt &
process_2 < input_2.txt &
process_3 < input_3.txt &
또는
for i in {1..3}; do "process_$i" < "input_$i.txt" & done
세 가지 프로세스는 모두 세 가지 다른 입력을 사용하여 병렬로 시작됩니다.
비슷한 작업을 수행하려면 xargs
다음을 사용할 수 있습니다 -I
.
printf "%s\n" {1..3} | xargs -I{} -P3 sh -c "process_{} < input_{}.txt"