일련의 프로세스를 실행하는 데몬 서비스(균형 분산)

일련의 프로세스를 실행하는 데몬 서비스(균형 분산)

다음과 같은 문제가 있습니다. 백그라운드에서 실행되는 기계 학습 프로세스가 있습니다. 더 좋은 점은 실행하고 싶은 것이 많다는 것입니다(예를 들어 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]}" "$@"

좀 더 강력한 것을 원한다면 잠금이 필요하고 데이터베이스에 상태를 유지할 수도 있습니다.

관련 정보