백그라운드에서 동일한 명령을 여러 번 실행


14

bash를 사용하여 여러 명령을 실행하고 백그라운드 화하는 방법은 무엇입니까?

예를 들면 다음과 같습니다.

$ for i in {1..10}; do wait file$i &; done

여기서 wait는 사용자 정의 바이너리입니다.

지금은 오류가 발생합니다.

syntax error near unexpected token `;'

위의 명령을 실행할 때.

백그라운드가되면 명령이 병렬로 실행됩니다.


1
당신이 언급하지 않는 것을 망설이고있다 : nohup당신이 백그라운드에서 명령을 실행할 수 있도록 허용
Dave Hamilton

3
당신이보고있는 오류 는 "명령 종결 자"에 기인 &하고 ;있습니다. 둘 다 사용할 필요는 없습니다 for ...; do wait $arg & done. 작동합니다.
glenn jackman

@glenn jackman. 예, 실제로 질문을 게시 한 후에 시도했습니다. 둘 다 필요가 없습니다. 및
Sebi

3
미래의 독자들을 위해, 다음 문서에 대한 링크 : "목록은 하나의 연산자 ';', '&', '&&'또는 '||' 중 하나로 분리 되고 선택적으로 하나에 의해 종료되는 하나 이상의 파이프 라인 시퀀스입니다 ';', '&'또는 개행 문자 중 하나입니다. " (emphasis mine)
glenn jackman

답변:


21

&,처럼은 ;A는 리스트 터미네이터 연산자. 그것들은 같은 문법을 가지고 있으며, 당신이하고 싶은 것에 따라 서로 바꿔서 사용할 수 있습니다. 이 원하지 않는 것을 의미 나 필요성 command1 &; command2, 당신이 필요로하는 모든입니다 command1 & command2.

따라서 귀하의 예에서 다음과 같이 작성할 수 있습니다.

for i in {1..10}; do wait file$i & done

wait명령은 백그라운드에서 시작되고 루프는 즉시 다음으로 넘어갑니다.


4

호환성을 위해 확장 대신 posix 양식을 사용하십시오.

for i in $(seq 1 10); do (./wait file$i &); done

1
참고 seqPOSIX의 명령하지 않고 일반적으로 단지 GNU 시스템에 있습니다. 동작 또는 $(...)(및 $i)은의 현재 값에 따라 다릅니다 $IFS. 또한 수행하여 있습니다 (cmd &), cmd당신이 기다리고 예를 들어 종료 상태를 얻을 수 없습니다, 그래서 서브 쉘의 자식이 될 것입니다.
Stéphane Chazelas

2

명령을 그룹화하고 그룹화 된 명령을 백그라운드에 둘 수 있습니다. 처럼 :

$ for i in {1..10}; do ((wait file$i)&); done

내부 괄호를 사용할 필요가 없습니다.
marc

질문에서 요청한대로 여러 명령을 백그라운드에 넣으려면 내부 괄호 만 사용해야합니다. 처럼 ((sleep 1; wait file $ i) &);
16:23에

2

바이너리가 실제로 이름이 wait있습니까? wait쉘은 내장 되어 있기 때문에 권장하지 않습니다 .

bash는 백그라운드 프로세스를 시작하는 한 줄 루프를 잘 구문 분석하지 못한다고 생각합니다. 코드를 다음과 같이 변경하는 것이 좋습니다.

$ for i in {1..10}; do ./wait file$i & echo "Running 'wait' using PID=$!..."; done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.