이전 명령 처리가 완료된 경우에만 다음 명령을 트리거하는 bash 스크립트를 작성하는 방법

이전 명령 처리가 완료된 경우에만 다음 명령을 트리거하는 bash 스크립트를 작성하는 방법

프로세스를 트리거하는 이와 같은 명령이 있습니다.

./extract.sh 1553212800 1554854400 & 

예를 들어 프로세스 ID가 제공됩니다.1234

1234완료되면 다음 명령을 실행 하고 싶습니다.

./extract.sh 1554854400 1556668800 & 

이와 같은 명령이 더 많이 있습니다

답변1

완료될 때까지 기다리려면 백그라운드에 넣을 필요는 없지만 다음과 같습니다.

./extract.sh 1553212800 1554854400 & 
pid=$!
if wait "$pid"; then
    ./extract.sh 1554854400 1556668800 & 
fi

내장 프로그램이 wait종료되면 다음이 표시됩니다.

ID가 유효하지 않거나 제공된 옵션이 유효하지 않은 경우 마지막 ID의 상태를 반환합니다.

답변2

&쉘이 명령을 실행하도록 각 명령의 끝에서를 제거할 수 있습니다.아니요백그라운드 작업으로 실행하거나 실제로 백그라운드 작업으로 실행해야 하는 경우(다른 작업도 병렬로 수행하기 때문에) 완료하기 전에 프로세스의 PID를 변수에 저장해야 합니다 wait.

./extract.sh 1553212800 1554854400 & pid="$!"

# other things

wait "$pid"

./extract.sh 1554854400 1556668800 &  & pid="$!"

# other things (again)

wait "$pid"

# etc.

개인적으로 그러한 명령의 긴 목록이 있다면 모두 다음과 같은 스크립트에 넣을 것입니다.

#!/bin/sh

./extract.sh 1553212800 1554854400
./extract.sh 1554854400 1556668800

(참고로 백그라운드 작업은 없습니다)

그런 다음 다음과 같이 스크립트를 시작할 수 있습니다 nohup.

nohup ./script.sh &

이렇게 하면 로그아웃했다가 다시 로그인하여 스크립트 프로세스가 아직 실행 중인지 확인할 수 있습니다( check 를 사용하여 ps).

아니면 그냥 세션을 시작 하고 일반(no ) tmux처럼 스크립트를 시작한 다음 분리를 누를 수도 있습니다. 나중에 .을 사용하여 동일한 쉘 세션으로 돌아갈 수 있습니다 . 설명서 를 참조하세요 .nohupCtrl+Bdtmux attachtmux

답변3

이것이 명시된 질문에 직접적으로 대답할 수는 없지만 특히 OP가 아직 파이프라인을 확정하지 않은 것처럼 보이기 때문에 이 솔루션을 제안하겠다고 생각했습니다.

많은 Posix 셸에서는 기호를 통해 여러 명령을 함께 연결할 수 있습니다 &&. 기본적으로 이는 첫 번째 명령을 실행한 다음 첫 번째 명령이 오류 없이 실행을 마친 후 실행을 의미합니다 &&.

./extract.sh 1553212800 1554854400 && ./extract.sh 1554854400 1556668800 &

그러나 이는 모든 것을 하나의 대규모 백그라운드 프로세스로 실행합니다. 또한 오류를 발생시킨 명령 다음에 오는 명령이 실행되지 않을 위험이 있습니다. 따라서 다음과 같은 시나리오에서:

./valid_run.sh && ./throws_error.sh && ./second_valid_run.sh

valid_run.sh제대로 작동하지만 실행 throws_error.sh되지 않으면 실행 second_valid_run.sh되지 않습니다.

또는 더 깔끔한 접근 방식은 모든 명령을 래퍼 BASH 스크립트에 저장한 다음 해당 스크립트를 실행하는 것입니다.

래퍼.sh:

#!/bin/bash
./extract.sh 1553212800 1554854400
./extract.sh 1554854400 1556668800

명령줄:

$ ./wrapper.sh &

나는 이것이 아마도 명령을 구성하는 가장 좋은 방법이라고 생각합니다.

관련 정보