comandos FIFO no script bash

1

Estou tentando descobrir se existe um comando que permita chamar outro script e tratar essas chamadas na ordem FIFO.

E.G .: o script A funciona em um loop infinito. Neste loop, 10 solicitações sucessivas são feitas para executar o script B. No entanto, o script B só pode ser executado quando sua solicitação anterior foi finalizada. O Script A tem que continuar trabalhando enquanto os 10 scripts requisitados B são executados sucessivamente.

    
por L. De Smedt 17.10.2016 / 22:05

3 respostas

3

O wait embutido do shell foi projetado para resolver exatamente esse propósito, esperar que algum processo (ou processos) termine e colete seu status de saída.

Você pode:

  • Execute script_A em um loop infinito ou exit se ele gerar e terminar a execução de 10 instâncias de script_B

  • Com script_A , use uma construção em loop, dentro do loop, envie o script_B para background, obtenha seu PID usando $!

  • Aguarde até que o processo termine em wait PID

  • Faça isso 10 vezes

  • Saia de script_A ou continue com outra coisa

Então você pode fazer script_A como:

#!/bin/bash
for ((i=1; i<=10; i++)); do
    echo "Run $i :: script_B"
    /path/to/script_B &
    pid=$!
    wait "$pid"
done

Se você quiser continuar fazendo outra coisa, anexe-os após a construção for .

Apenas por questão de integridade, se você quiser continuar / sair com base no status de saída do último scrip_B , adicione uma breve verificação para o status de saída também:

#!/bin/bash                                                                  
for ((i=1; i<=10; i++)); do
    echo "Run $i :: script_B"
    /path/to/script_B &
    pid=$!
    wait "$pid" && continue
    break
done
    
por heemayl 18.10.2016 / 05:36
1

O que eu uso em um script para evitar que ele seja executado duas vezes é um arquivo de status, mas você pode adaptar facilmente o mesmo sistema para permitir que scripts sejam executados no modo FIFO:

Por exemplo no exemplo abaixo, o script só sairá se já estiver em execução:

#!/bin/bash 

if [ -f /var/tmp/backup.bsy ]; then 
    # backup already running, log and exit
    exit; 
fi

# Set backup status to "Busy"
mv /var/tmp/backup.ok /var/tmp/backup.bsy

# perform backup here

# Set backup status to "Done"
mv /var/tmp/backup.bsy /var/tmp/backup.ok

e é trivial alterar o exit para um loop que sleep sa alguns segundos / minutos (dependendo dos seus requisitos de uso) e verificar se script.1 , script.2 , script.3 , script.4 , ... existe e executa na ordem correta ...

; -)

    
por Fabby 17.10.2016 / 23:36
1

Talvez eu esteja entendendo mal, mas você não pode simplesmente colocar as invocações de scriptB dentro de um grupo de comando (ou subshell), e background que para que o grupo é executado de forma assíncrona, por exemplo,

#!/bin/bash

echo "Submiting B command group at: $(date)"

{
  ./scriptB
  ./scriptB
  ./scriptB
  ./scriptB
  ./scriptB
  ./scriptB
  ./scriptB
  ./scriptB
  ./scriptB
  ./scriptB
} &

echo "Continuing to work at: $(date)"

exit

onde, para fins de ilustração, scriptB é apenas

#!/bin/bash

echo "Starting B at: $(date)"
sleep $((RANDOM/8192))

então

$ ./scriptA
Submiting B command group at: Mon Oct 17 19:50:07 EDT 2016
Continuing to work at: Mon Oct 17 19:50:07 EDT 2016
user@host$ Starting B at: Mon Oct 17 19:50:07 EDT 2016
Starting B at: Mon Oct 17 19:50:10 EDT 2016
Starting B at: Mon Oct 17 19:50:11 EDT 2016
Starting B at: Mon Oct 17 19:50:12 EDT 2016
Starting B at: Mon Oct 17 19:50:13 EDT 2016
Starting B at: Mon Oct 17 19:50:15 EDT 2016
Starting B at: Mon Oct 17 19:50:15 EDT 2016
Starting B at: Mon Oct 17 19:50:18 EDT 2016
Starting B at: Mon Oct 17 19:50:18 EDT 2016
Starting B at: Mon Oct 17 19:50:18 EDT 2016
    
por steeldriver 18.10.2016 / 01:58