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

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

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

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

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

Responder1

Depende de quão robusto você deseja que isso seja. Uma solução simples 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ê quiser algo mais robusto, precisará de bloqueio e provavelmente manterá o estado em um banco de dados.

informação relacionada