Stupid Batch Queue (SBQueue)

sbqueue

Motivação

O Stupid Batch Queue, ou simplesmente SBQueue, é um enfileirador de tarefas com execução sequencial para Linux (mas roda em outros sabores de UNIX). Nele as tarefas vão sendo colocadas em uma fila e sendo processadas uma após a outra e com a execução da seguinte sempre após o término da anterior. ou seja, não há execução em paralelo. Mas por que recriar um enfileirador de tarefas? Não se poderia simplesmente utilizar o cron ou mesmo o at? Aliás, não é justamente a tarefa deles? A resposta é simples: criei este programa porque precisava ter um grupo de tarefas sendo fossem executadas uma após o término da outra e, a sequência precisava ser respeitada e, claro, era impossível concatená-las.

Um pouco de história… em UNIX existe um comando para a execução (quase) sequencial de tarefas , o batch. Nestes mesmos UNIXes há variáveis de sistema e ferramentas (como é o caso do queuedefs no AIX, HP/UX e SCO) onde você informa ao responsável pelo agendamento o número máximo de processos a executar simultaneamente. Basta dizer que o valor é 1 e seja bem vindo ao mainframe way of life!

No caso específico do Linux a “funcionalidade histórica” do comando batch é implementada através do atd (at dæmon) a partir comando atrun e ele funciona executando as tarefas agendadas sempre que carga a média do sistema (load) encontra-se abaixo de 0,8. O grande problema é que os atuais  processadores são suficientemente eficientes e rápidos para, mesmo em ambientes de grande processamento, manter uma carga média sempre próxima deste valor, assim, o tempo que as tarefas ficam “esperando sua vez” na fila não é suficiente para as antecessoras finalizem o processamento.

Mas o curioso é que não escrevi o SBQueue para resolver este problema. Ele foi foi resolvido por quem originalmente criou a motivação do problema! Ele foi criado para resolver uma falha na arquitetura do enfileirador original onde a fila foi implementada em named pipe (FIFO). Em um mundo perfeito não haveria problemas mas no mundo real bastava uma tarefa travar para toda a fila ser perdida para toda a eternidade, também não era possível saber o que havia na fila (ler o conteúdo da fila removeria um item nela) e muito menos retirar uma tarefa agendada (claro, a não ser que você tivesse certeza absoluta que ela era a próxima).

Sendo assim o SBQueue foi escrito do zero clonando a primeira “solução”, (quase) imitando a sintaxe dos comandos e produzindo, modéstia a parte, uma ferramenta bem mais gerenciável.

Funcionamento

O programa não tem a pretensão de ser um dæmon de sistema, nem foi escrito para tal, foi feito para ser executado no ambiente de trabalho de um usuário específico, mais precisamente naquele onde é instalado. É composto por dois programas: um é o sbqueue com as ferramentas para o gerenciamento da fila e o outro é o sbqd, o dæmon encarregado da execução sequencial das tarefas.

Os arquivos

Todo o SBQueue é composto por três arquivos localizados no diretório $HOME/.sbqueue:

  • sbqueue — Responsável por implementar os comandos e demais funcionalidades;
  • sbqd — O dæmon encarregado da execução sequencial das tarefas e
  • sbqueue.conf — O arquivo de configuração

Tem quatro diretórios onde são armazenadas informações sobre as tarefas executadas:

  • error/ — Contendo o retorno de STDERR das tarefas executadas;
  • output/ — Contendo o retorno de STDOUT das tarefas executadas;
  • run/ — Originalmente a saída dos programas vai para /dev/null, desejando registrar o que acontece, configure o conteúdo da variável SBQRUN no arquivo sbqueue.conf para apontar para este diretório.
  • tasks/ — Contendo as tarefas agendas para execução.

E dois arquivos relativos à operação e funcionamento:

  • sbqueue.log — O arquivo de log com o funcionamento do programa
  • sbqd.pid — Quando em execução o sbqd armazena aqui o número do seu processo.
  • sbqueue.status — O estado da fila.

Há ainda o arquivo $HOME/.sbqueuerc que aponta para o diretório que referencia o diretório de instalação do SBQueue e  dentro de $HOME/bin ficam os comandos do programa (todos links simbólicos para o sbqueue).

sbqueue.conf

Ele é criado automaticamente durante a instalação e tem a seguinte estrutura:

# Stupid Batch Queue - configuration file

# sbqueue programns
SBQBIN=/home/giovanni/bin

# time elapsed between tasks (in seconds)
SBQWAIT=5

# my internal variables
SBQERR=/home/giovanni/.sbqueue/error
SBQLOG=/home/giovanni/.sbqueue/sbqueue.log
SBQOUT=/home/giovanni/.sbqueue/output
SBQPID=/home/giovanni/.sbqueue/sbqd.pid
SBQRUN=/dev/null
SBQSTA=/home/giovanni/.sbqueue/sbqueue.status
SBQTSK=/home/giovanni/.sbqueue/tasks

# the sbqueue commands
CMDENQE='sbqenq'
CMDHELP='sbqhelp'
CMDHOLD='sbqhold'
CMDLIST='sbqlist'
CMDRELE='sbqrelease'
CMDREMO='sbqremove'
CMDSTAT='sbqstat'
CMDSTRT='sbqstart'
CMDSTOP='sbqstop'
CMDVIEW='sbqview'

Nem preciso dizer que as variáveis $CMDxxxx permitem customizar totalmente os comandos do programa.

Instalação

O programa está disponível na minha conta do GitHub, basta baixar baixá-lo, descompactar seu conteúdo e executar o programa de instalação (install.sh) que ele cuidará de colocar os arquivos nos lugares corretos e de fazer as demais configurações. Talvez, dependendo da distribuição de Linux, seja necessário criar/definir no PATH o diretório $HOME/bin para ter acesso aos programas.

Operação

Uma vez instalado, verifique o estado da fila (por padrão ela sempre começa em HOLD)

$ sbqstat 
HOLD

Os comandos sbqrelease e sbqhold cuidam respectivamente de liberar (RELEASE) ou segurar (HOLD). Uma tarefa é colocada na fila através do comando sbqenq:

$ sbqenq 
uname -a<CTRL>+<D>
task scheduled as 554cb310.81

Os comandos sbqremove serve para remover uma tarefa da fila enquanto que o sbqview serve para visualizar seu conteúdo. Nos dos casos deve-se utilizar a task ID, ou seja, o número que é informado na hora do enfileiramento. No exemplo anterior:

$ sbqview 554cb310.81
#!/bin/sh
# task 554cb310.81 submited by giovanni
cd /home/giovanni

uname -a

exit 0

O comando sbqlist exibe as tarefas atualmente na fila:

$ sbqlist 
1    554cb310.81
total of 1 task(s) in queue

Os comando sbqstart e sbqstop iniciam e param o sbqd, quem efetivamente cuida de executar as tarefas colocadas na fila:

$ sbqstart
$ sbqrelease
RELEASED
$ sbqstop

Toda a operação fica registrada em ~/.sbqueue/sbqueue.log:

$ cat  ~/.sbqueue/sbqueue.log
2015-05-08 09:59:10 Task 554cb310.81 scheduled
2015-05-08 10:06:52 Starting SBQD at PID 3758
2015-05-08 10:07:04 Releasing queue
2015-05-08 10:07:07 processing task-554cb310.81
2015-05-08 10:07:08 Stoping daemon

E, em caso de dúvidas, o comando sbqhelp lista os comandos disponíveis.

Outras informações

O SBQueue está licenciado pela GPL e, claro, retornos quanto a bugs, falhas e inclusive sugestões de melhorias e de funcionamento são bem vindas.