xargs -P는 백그라운드 프로세스를 실행합니까? &를 사용하는 것과 어떻게 다른가요?

xargs -P는 백그라운드 프로세스를 실행합니까? &를 사용하는 것과 어떻게 다른가요?

다음과 같은 파일이 있습니다 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.shprocess_2.shprocess_3.sh

sh executable_processes.sh

내 동료는 첫 번째 예(using xargs -L1 -P3)가 세 개의 프로세스를 "실제로 병렬"로 실행하는 반면 두 번째 예( sh executable_processes.shusing)는 &세 개의 프로세스를 백그라운드 프로세스로 실행하지만 여전히 계속해서 백그라운드로 전송 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_1cat

사용법이 &서로 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"

관련 정보