프로세스가 완료되면 bash 명령을 실행하십시오.

프로세스가 완료되면 bash 명령을 실행하십시오.

GPU를 사용하고 ML 모델을 학습하는 두 개의 스크립트가 있습니다. 자기 전에 시작해서 밤에 효과를 보고 아침에 효과를 보고 싶습니다.

하지만 GPU 메모리가 제한되어 있기 때문에 병렬이 아닌 직렬로 실행하고 싶습니다.

python train_v1.py && python train_v2.py; 를 사용할 수 있지만 train_v1동시에 훈련 시간이 더 오래 걸리기 때문에 두 번째 스크립트의 구현을 시작하고 완료한 후 자동으로 실행 train_v2.py하려고 합니다 .python train_v1.py

어떻게 해야 하나요? 감사해요.

답변1

train_v1.py다음은 다른 프로세스가 아직 살아 있는지 반복하고 확인하거나 일반적으로 수행되는 방식과 다른 방식으로 호출하는 것을 포함하지 않는 방법입니다 .

$ python train_v1.py
^Z
[1]+  Stopped                 python train_v1.py
$ % && python train_v2.py

^Z프로세스가 실행되는 동안 +를 눌러 Ctrl신호를 보내 절전 모드로 전환 하는 경우 입니다 . 그런 다음 셸에 를 사용하여 깨우도록 지시합니다. 이를 마지막에 명령으로 추가할 수 있습니다. 이렇게 하면 처음부터 했던 것처럼 동작하게 됩니다.Ztrain_v1.pySIGTSTP%&& python train_v2.pypython train_v1.py && python train_v2.py

대신 을 %사용할 수도 있습니다 fg. 이러한 유형의 쉘 기능에 대해 더 알고 싶다면 다음을 읽으십시오.Bash 맨페이지의 "작업 제어" 섹션.

편집: 대기열에 계속 추가하는 방법

Jamesdlin이 의견에서 지적했듯이 train_v3.pyv2가 시작되기 전에 스키마를 계속 추가하려고 하면 다음을 수행할 수 없다는 것을 알게 될 것입니다.

$ % && python train_v2.py
^Z
[1]+  Stopped                 python train_v1.py

train_v1.py아직 시작되지 않았기 때문에 중지 되며 train_v2.py, 아직 시작하지도 않은 작업은 중지/일시 중지/잠자기할 수 없습니다.

$ % && python train_v3.py

같은 결과를 가져올 것이다

python train_v1.py && python train_v3.py

%마지막으로 정지된 프로세스에 해당하기 때문입니다 . v3이와 같이 추가하려고 시도해서는 안 되며 기록을 사용해야 합니다.

$ !! && python train_v3.py
% && python train_v2.py && python train_v3.py

위와 같이 히스토리 확장을 수행하거나 키 바인딩(up과 같은)을 사용하여 마지막 명령을 호출하고 끝에 v3를 추가할 수 있습니다.

$ % && python train_v2.py && python train_v3.py

이는 파이프라인에 더 많은 콘텐츠를 추가하기 위해 반복될 수 있는 작업입니다.

$ !! && python train_v3.py
% && python train_v2.py && python train_v3.py
^Z
[1]+  Stopped                 python train_v1.py
$ !! && python train_v4.py
% && python train_v2.py && python train_v3.py && python train_v4.py

답변2

이미 시작한 경우 프로세스가 종료될 때까지 프로세스를 폴링한 다음 두 번째 Python 스크립트를 실행할 python train_v1.py수 있습니다 .pgrep

while pgrep -u "$USER" -fx 'python train_v1.py' >/dev/null
do
    # sleep for a minute
    sleep 60
done
python train_v2.py

-f및를 사용하면 -x첫 번째 Python 스크립트를 시작하는 데 사용된 정확한 명령줄을 일치시킬 수 있습니다. 일부 시스템에서는 조용하게 만드는 옵션을 pgrep구현합니다 ( 에서처럼 ). 이는 리디렉션이 필요하지 않음을 의미합니다.-qgrep -q/dev/null

-u옵션은 실행 중인 명령에 대한 일치를 제한합니다(같은 시스템에 있는 친구나 다른 사람에게는 해당되지 않음).

아직 첫 번째 스크립트를 시작하지 않은 경우:

댓글에서 언급했듯이 첫 번째 스크립트 바로 다음에 두 번째 스크립트를 시작할 수 있습니다. 두 번째 스크립트가 존재하지 않거나 아직 실행할 준비가 되지 않았다는 사실은 중요하지 않습니다(첫 번째 스크립트가 완료될 때 실행할 준비가 되어 있는 한).

python train_v1.py; python train_v2.py

그렇게 하면 첫 번째 스크립트의 종료 상태에 관계없이 두 번째 스크립트가 시작됩니다. 질문에 표시한 대로 대신 사용하면 &&작동 ;하지만 두 번째 스크립트를 시작하기 전에 첫 번째 스크립트를 성공적으로 완료해야 합니다.

답변3

다음을 사용하여 첫 번째 스크립트를 시작할 수 있습니다.

python train_v1.py; touch finished

그런 다음 주기적으로 존재 여부를 확인하는 루프를 만듭니다 finished.

while [ ! -f finished ] ; do     
    sleep 5
done
python train_v2.py
rm finished

답변4

첫 번째 스크립트의 종료 상태를 알 필요가 없다면 다음과 같은 것을 권장합니다.코살로난다는 무엇을 썼나요?.

종료 상태를 정말로 알아야 하는 경우에는 더 복잡합니다(이 경우에는 그렇지 않을 수도 있지만 다른 사람들은 이를 수행하는 솔루션을 찾고 있을 수 있습니다). 나는 썼다리눅스 소형 유틸리티pwait이를 통해 프로세스가 완료될 때까지 기다리고 종료 상태를 확인할 수 있습니다.

관련 정보