Criando filas de tarefas em momentos

2

O UNIX oferece alguma maneira de criar filas que iniciam regularmente em um determinado momento, em seguida, permite que você adicione gradualmente um número de tarefas a essa fila que será executada sequencialmente nesse momento?

Eu sei sobre cron e at , no entanto:

  • cron não tem um sistema de fila.
  • at parece não suportar tarefas sequenciais e lista tarefas de uma forma muito hostil ("listar todos" apenas imprime número de tarefas e data, enquanto informações sobre uma única tarefa imprimem todo o env .)

Eu imagino algo assim:

$ create queue a at midnight
$ add "ffmpeg -i a.mkv a.mp4" to a
$ add "ffmpeg -i b.mkv b.mp4" to a
$ add "ffmpeg -i c.mkv c.mp4" to a

$ create queue b at noon
$ add "mysqldump ..." to b

$ list queue a
RUNNING  ffmpeg -i b.mkv b.mp4
NEXT     ffmpeg -i c.mkv c.mp4

$ mail
>N 1 Task Daemon Thu Sep 1 00:23 <user@localhost> ffmpeg -i a.mkv a.mp4

Para registro, minha necessidade real é programar tarefas exigentes de CPU / tempo à noite enquanto meu laptop está em uma sala com uma porta fechada, então não consigo ouvir o ventilador (ou sentir o calor da CPU).

    
por forthrin 04.09.2016 / 13:26

3 respostas

2

Você pode desdenhar at , mas faz parte do que você quer se você usar seus recursos lote . Se você der ao comando at o nome da única letra maiúscula de uma fila, por exemplo, -q M , então todos os comandos nessa fila só serão executados no horário solicitado se a carga do sistema for menor que 0.8, e ele vai espaço para iniciar os trabalhos por 60 segundos.

Você pode alterar a carga e o intervalo com as opções -l e -b para o daemon atd . As tarefas são executadas na ordem de envio e atq -q M lista apenas as tarefas na fila determinada.

    
por 04.09.2016 / 16:01
1

Cron e at são as únicas coisas que são comumente instaladas em sistemas Unix. Mas existem sistemas de agendamento de vagas mais caros por aí. Existe uma interface padrão para enfileirar um trabalho: qsub . Se você deseja agendar um trabalho para a próxima meia-noite:

{ echo '#!/bin/sh'; echo 'ffmpeg -i a.mkv a.mp4'; } >a.script
qsub -a $(date -d 'tomorrow 0:00' +%Y%m%d%H%M) a.script

O Ubuntu inclui dois agendadores de trabalho que implementam a interface POSIX (derivada do NQS): TORQUE e Slurm . Existem outras implementações de código aberto e não tenho nenhum conselho específico sobre a escolha de uma.

    
por 06.09.2016 / 01:45
0

Se esses forem trabalhos de execução única (em oposição aos periódicos), o método mais fácil é usar apenas tmux e sleep . Abra uma sessão do tmux e faça isso:

$ echo "ffmpeg -i a.mkv a.mp4" > midnight.sh
$ echo "ffmpeg -i b.mkv b.mp4" >> midnight.sh
$ let secs_till_midnight=$(date -d "'date -d '+1 day' +%F'" +%s)-$(date +%s)
$ sleep $secs_till_midnight && sh midnight.sh

Programe mais trabalhos em novos painéis / janelas na mesma sessão e, quando terminar, desconecte-se dessa sessão. É isso aí! Seu próprio agendador caseiro!

Mesmo que você não possa listar tarefas em execução, adicione essas duas linhas no início do midnight.sh para obter visibilidade extra:

set -x
exec 2>midnight_err >midnight_out

Agora, cada comando será enviado para o terminal antes de ser executado e todas as saídas do comando serão redirecionadas para midnight_* files.

Agora, basta anexar a essa sessão ou tail dos arquivos de log para verificar o status!

    
por 04.09.2016 / 14:06

Tags