동시 명령 후 bash 명령을 실행 하시겠습니까?


13

일부 명령을 병렬로 실행하고 싶습니다. 이 모든 명령이 완료되면 다음 명령을 시작하십시오. 나는 다음과 같은 접근법이 효과가 있지만

#!/bin/bash
command1 &
command2 &
command3 &&
command4

그러나 그렇지 않았습니다. command4처음 세 명령이 모두 완료되면 실행해야합니다 .

답변:


28
#!/bin/bash
command1 &
command2 &
command3 &

wait
command4

wait (인수없이) 모든 백그라운드 프로세스가 종료 될 때까지 기다립니다.

의 완전한 설명 waitbash수동 :

wait [-n] [n ...]

지정된 각 하위 프로세스를 기다렸다가 종료 상태를 리턴하십시오. 각각 n프로세스 ID 또는 작업 사양 일 수 있습니다. 작업 스펙이 제공되면 해당 작업 파이프 라인의 모든 프로세스가 대기합니다. 경우 n제공되지 않으며, 현재 활성화 된 모든 자식 프로세스는 기다렸다되며, 반환 상태는 0입니다. 경우 -n옵션이 제공되어, wait어떤 작업 대기 종료 및 종료 상태를 반환합니다. 경우 n지정 존재하지 않는 프로세스 또는 작업이 반환 상태가 그렇지 않은 경우 127 인 경우, 반환 상태는 마지막 프로세스 또는 작업의 종료 상태가 기다렸다입니다.


1
또 다른 옵션은 PID1=$!다음 과 같은 것을 사용하여 각 자식의 PID를 저장 한 다음로 모든 자식 을 기다리는 것입니다 wait "$PID1" "$PID2" "$PID3". 조금 더 복잡하지만 프로세스에 대기하지 않으려는 다른 자식이 있으면 작동합니다.
kasperd

1
@kasperd이 경우 배열을 사용하는 cmd1 & pids=( $! ); cmd2 & pids+=( $! ); cmd3 & pids+=( $! ); wait "${pids[@]}"것이 좋습니다.
Kusalananda

@kasperd "더 나은"이란 "하나의 변수 만 사용"을 의미합니다. 많은 것을 사용하는 것이 본질적으로 잘못된 것은 아니며 아마도 이런 작은 경우에는 완전히 괜찮을 것입니다.
Kusalananda

0

나는 wait대답을 좋아 하지만 학문적 운동처럼 이것이 효과가 있다고 생각합니다.

bash -c 'command1 & command2 & command3 &' && command4

내가 틀렸다면 정정 해주세요.


2
이것을 테스트 했습니까? 절대로 작동하지 않습니다. 예 : time bash -c "sleep 5 &sleep 5 &sleep 5 &" && echo foo bash 명령이 5 초가 걸렸다 고 말하지 않으면 원하는 것을 수행하지 않은 것입니다.
세스 로버트슨

나는 그것을 수면과 메아리로 테스트했으며 작동하는 것처럼 보였다. 당신의 예는 그렇지 않다는 것을 증명합니다.
버거
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.