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


13

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

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

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

답변:


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

wait
command4

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

의 완전한 설명 wait에 bash수동 :

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.