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.