다음 질문이 있습니다. 백그라운드에서 실행되는 기계 학습 프로세스가 있습니다. 더 좋은 점은 내가 실행하고 싶은 항목이 많다는 것입니다(가령 5개라고 가정해 보겠습니다). 각각은 CPU와 GPU의 전력을 소비하므로 특정 기간(예: 1시간, 실제로 스크립트 자체는 1시간 후에 종료될 수 있음) 동안 하나만 실행한 다음 중지하는 것이 바람직합니다. 그것을 실행하고 다른 하나를 실행합니다. 이렇게 하면 기계가 며칠 동안 동시에 작동하는 동안 모든 것을 훈련할 수 있습니다.
도전 과제는 다음과 같습니다. 균형/회전으로 실행되기를 바랍니다. 스크립트/핸들러가 첫 번째 스크립트를 실행하고 컴퓨터를 다시 시작한 후(또는 upstart 서비스 등을 다시 시작한 후) 첫 번째 스크립트/핸들러를 실행하는 대신 두 번째 스크립트/핸들러가 실행되는지 확인하고 싶습니다. 곧. 다시 시작할 때마다 동일한 프로세스로 시작하여 첫 번째 프로세스에 대부분의 시간을 소비하고 마지막 프로세스에 가장 적은 시간을 소비하는 상황을 피하고 싶습니다.
누구든지 즉시 사용 가능한 솔루션을 제안할 수 있습니까(직접 스크립트/핸들러를 작성하는 것 외에는 분명히 쉽지만 직접 관리해야 하는 것보다는 철저하게 테스트된 것을 원합니다).
답변1
얼마나 강력한지를 원하는지에 따라 다릅니다. 반복 목록에서 "다음" 프로그램을 실행하는 간단한 솔루션은 다음과 같습니다.
#! /usr/bin/env bash
programs=(program1 program2 program3 program4 program5)
state=$HOME/.${0#*/}_state
if [ -f "$state" ]; then
read idx <"$state"
if expr "$idx" : '[0-9][0-9]*$' >/dev/null; then
let idx=(idx+1)%${#programs[@]}
else
let idx=0
fi
else
let idx=0
fi
printf '%d\n' "$idx" >"$state" || exit 1
exec "${programs[$idx]}" "$@"
좀 더 강력한 것을 원한다면 데이터베이스에 상태를 잠그고 저장해야 할 수도 있습니다.