Serviço daemon que executa uma sequência de processos (distribuição balanceada)

1

Eu tenho o seguinte problema. Eu tenho um processo de aprendizado de máquina que é executado em segundo plano. Melhor ainda, eu tenho muito (digamos 5) que eu quero executá-los. Cada um deles consome muita energia da CPU e da GPU e, portanto, gostaria de executar apenas um deles por um período específico de tempo (ou seja, 1h, na verdade, o próprio script pode fechar após 1h), interrompê-lo e executar outro 1. Desta forma eu posso treinar todos eles enquanto a máquina estiver funcionando por vários dias simultaneamente.

O desafio é o seguinte: Eu quero executá-los equilibrados / girados. Em vez de executar o primeiro, depois o segundo, o terceiro, etc. Eu quero que o script / manipulador garanta que após o primeiro ser executado e a máquina ser reiniciada (ou o serviço upstart seja reiniciado ou algo parecido), o segundo seja executado. Eu quero evitar a situação que, após cada reinício, ele começa com o mesmo processo e a maior parte do tempo é gasto no primeiro, e menos no último.

Alguém poderia sugerir uma solução pronta para uso (exceto para escrever meu próprio script / manipulador que é obviamente fácil, mas eu gostaria de algo completamente testado em vez de algo do meu próprio que eu preciso gerenciar).

    
por Michal Wilkowski 03.11.2016 / 07:51

1 resposta

0

Depende de quão robusto você quer que isso seja. Uma solução simplista que executa o "próximo" programa em uma lista circular pode ser assim:

#! /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]}" "$@"

Se você quer algo mais robusto, você precisa bloquear e provavelmente manter o estado em um banco de dados.

    
por 03.11.2016 / 09:34