쉘 스크립트에서 두 개 이상의 명령을 동시에 실행

Nov 28 2020

쉘 스크립트에서 병렬로 명령을 실행하는 것은 종종 매우 도움이되지만 그 방법을 찾을 수 없습니다. 이게 가능해? 그렇다면 어떻게해야합니까? 나는 주로 fish.

완료하는 데 시간이 오래 걸리지 만 모든 것을 완료하는 데 걸리는 시간을 줄이기 위해 동시에 실행할 수 있거나 실행해야하는 명령을 실행할 때 유용합니다.

답변

5 KamilMaciorowski Nov 28 2020 at 16:03

가장 기본적인 접근 방식은입니다 &. 이 다른 대답 은 옳습니다. 또한 stdin, stdout 및 stderr을 옹호 nohup하지만 nohup사용자가 원할 수도 있고 원하지 않을 수도 있습니다. 읽기 의 차이를 nohup, disown그리고& 하고 교육 결정을 내릴.

또 다른 접근 방식은 parallel. 병렬화하려는 명령이 서로 유사 하고 패턴을 만들 수있는 경우 유용합니다 .

도구의 기본 변형 ( moreutils, 최소한 Debian에서 )을 사용하면 동시에 실행되는 작업 수를 제한 할 수 있습니다. GNUparallel 는 더 발전했습니다. 실행하려는 작업이 출력을 생성하는 경우 다음 옵션이 특히 유용합니다.

--group
그룹 출력. 각 작업의 출력은 함께 그룹화되고 명령이 완료 될 때만 인쇄됩니다. 먼저 Stdout (표준 출력) 다음에 stderr (표준 오류)가옵니다. […]

( 출처 )

( --group기본적으로 활성화되어 있으므로 일반적으로 명시 적으로 사용할 필요가 없습니다.)

--keep-order
-k
출력 순서는 입력 순서와 동일하게 유지하십시오. 일반적으로 작업 출력은 작업이 완료되는 즉시 인쇄됩니다. […] -k은 출력이 인쇄되는 순서에만 영향을 미치며 작업이 실행되는 순서에는 영향을주지 않습니다.

( 출처 )

그들과 함께 여러 작업의 출력이 구성되며 &. 때때로 당신은 출력에 관심이 없지만 여전히 시퀀스에 관심이있을 수 있습니다. GNU 가 여러 프로세스 를 병렬화 하고 각 프로세스에서 종료 상태를 가져 와서 시퀀스를 유지하는 데 사용되는 이 답변 과 같습니다 .parallelcurl

데비안에서 GNU parallelparallel. 별도의 실행 파일 parallel로 모든 쉘에서 실행할 수 있습니다.

2 Giacomo1968 Nov 28 2020 at 11:12

이를 수행하는 가장 좋은 방법 nohup은 명령 앞에 &추가 된 명령과 명령 끝에 추가하는 것입니다.

핵심 목표가 무엇인지 명확하지 않지만 도움이되기를 바랍니다.

Linux 시스템에서 백그라운드 프로세스로 명령을 실행하려면 명령 앞에 명령을 nohup추가 &하고 끝에 추가 해야합니다.

따라서 최종 명령은 다음과 같습니다.

nohup [your command] &

이는 nohup명령이 "전화 끊기"를 무시해야 함을 의미하며 여기에 &추가 된 앰퍼샌드 는 시스템이 명령을 백그라운드 프로세스로 실행하도록 지시하는 셸 명령입니다. 사용법에 대한 자세한 내용은 여기에서 찾을 수 있습니다 .

이와 같은 명령을 실행하면 프로세스가 실행되고 명령 프롬프트로 돌아가며 터미널 세션을 종료하거나 해당 터미널 세션 동안 해당 명령과 관련없는 다른 작업을 수행 할 수 있습니다.