Sistema de filas simples?


10

Dado um PC comum, gostaríamos de usá-lo para executar algumas tarefas em segundo plano o tempo todo.

Basicamente, gostaríamos de ter comandos como:

add-task *insert command here*
list-tasks
remove-task(s)

As tarefas adicionadas devem ser simplesmente colocadas em uma fila e executadas uma após a outra em segundo plano (continuando sendo executadas após o logout do shell).

Existe algum script / programa simples que faça isso?

Respostas:


7

Há um batchcomando padrão que faz mais ou menos o que você procura. Mais precisamente, batchexecuta as tarefas quando a carga do sistema não é muito alta, uma de cada vez (para não fazer paralelização). O batchcomando faz parte do atpacote.

echo 'command1 --foo=bar' | batch      
echo 'command2 "$(wibble)"' | batch
at -q b -l              # on many OSes, a slightly shorter synonym is: atq -q b
at -q b -r 1234         # Unschedule a pending task (atq gives the task ID)

É errado dizer que o batchcomando "não faz paralelização". Geralmente, existe um atraso padrão de 60 segundos entre iniciar um trabalho e iniciar o seguinte; no entanto, não há nada para fazer o próximo trabalho aguardar o término do primeiro - atdiniciará os trabalhos da fila em lotes assim que o valor definido pela -bopção tiver decorrido (consulte a atdpágina de manual).
rsaw

O lote não serializa estritamente as tarefas; portanto, se você tiver um único recurso compartilhado, a resposta do @sitaram (spooler de tarefas) deve funcionar melhor.
ergosys

5

Outra solução é usar lpde criar um "driver de impressão" personalizado que execute seus trabalhos. Um amigo me ajudou a resolver isso quando tive um pedido semelhante. Crie um script como este e coloque-o em /tmp/batch.sh:

#!/bin/bash

TMPFILE=$(mktemp /tmp/XXXX)
exec <"$6"
cat - > $TMPFILE
chmod a+x $TMPFILE
$TMPFILE
rm -f $TMPFILE

Então corra:

lpadmin -p batch1 -E -P /tmp/batch.sh

Isso inicia uma fila e você pode criar mais usando outros nomes em vez do lote1. Adicione um trabalho com:

lp -d batch1 /path/to/jobscript

Gerenciar trabalhos com lpq, lprme lpstat. Se você deseja mais flexibilidade ao passar argumentos para seus trabalhos, pode tornar o script batch.sh mais sofisticado.

(Tentei batchantes de seguir esse caminho, mas ele não funciona como uma fila no OSX ou eu estava usando errado.)


Sei que a @arnaud especificou "PC de commodity", o que significa que provavelmente não é o OSX, onde testei esta solução. No entanto, isso deve ser portátil e muito mais flexível do que batch.
960 Joe Joe Fusion

11
Este é possível um dos hacks mais genuínos que eu já vi.
Thiago Macedo

Infelizmente, isso não parece mais funcionar. github.com/apple/cups/commit/…
wdkrnls

4

Existem muitos sistemas de filas, mas eles geralmente são muito especializados.

Você pode olhar para o atplanejador. É de croncerta forma, mas é mais parecido com uma fila para trabalhos únicos do que para trabalhos repetidos. Ele pode "agendar" coisas com base em critérios diferentes do tempo, como carga do sistema ou sequência de tarefas.

Sua distribuição favorita quase certamente terá pacotes para ela.


2

Percebo que essa pergunta tem vários anos, portanto pode não ajudar o pôster original, mas pode ajudar outra pessoa.

Primeiro: "spooler de tarefas" é a resposta. É muito poderoso e pelo menos o Fedora o possui.

Mas muitos dos servidores que uso, não consigo instalar pacotes arbitrários sem muito aborrecimento, por isso preciso de algo que seja idealmente puro bash (ou perl, ou tal).

Depois de lutar com isso por um tempo, criei uma implementação pura do bash que parece funcionar bem até agora. Você pode encontrá-lo em https://github.com/sitaramc/bq .

É apenas um script bash, portanto a instalação é trivial. No entanto, isso afeta seus segundo e terceiro requisitos (mas também deve ser trivial implementá-los).

O script é comentado liberalmente e você poderá revisá-lo em alguns minutos, se desejar.


O pacote debian é um spooler de tarefas, o executável é "tsp" em vez de "ts", que colidiu com outra coisa. Também gosto porque você pode reordenar tarefas que estão na fila, não pode fazer isso com at / batch.
ergosys
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.