imprime a saída de dois scripts de segundo plano

0

Estou tentando imprimir 2 saídas de scripts diferentes executados em segundo plano ao mesmo tempo com um terceiro.

Meu terceiro script se parece com:

#!/bin/bash
./script1 &
./script2 &

A saída de cada script é uma barra de progresso simples:

scriptN: [##....................] (10%) (10/100)

Eu gostaria que a saída fosse algo assim:

script1: [##....................] (10%) (10/100)
script2: [##....................] (10%) (10/100)
    
por muhamad li 11.11.2016 / 22:02

3 respostas

0

trabalhou após uma pequena pesquisa e a ajuda de @ZacharyBrady

#!/bin/bash
output1=$(mktemp /tmp/tmpout.XXXXXX)
output2=$(mktemp /tmp/tmpout.XXXXXX)
./script1 &> $output1 &
pid1=$!
./script2 &> $output2 &
pid2=$!

while [ -d "/proc/$pid1" ] || [ -d "/proc/$pid2" ]
do
    out1="$(tail -n 1 $output1)"
    out2="$(tail -n 1 $output2)"
    echo $out1
    echo $out2
    tput cuu1  # move cursor up by one line
    tput el # clear the line
    tput cuu1
    tput el
done
rm -f $output1 $output2    
    
por 12.11.2016 / 00:17
0

Eu não acho que isso seja possível, pelo menos não sem um enorme esforço. As barras de progresso dinâmicas no terminal dependem de caracteres de controle para alterar a posição do cursor e redesenhar os caracteres na tela. Executando dois programas simultaneamente, cada tentativa de controlar o que está sendo desenhado resultará em conflitos entre os dois programas.

Pode ser possível escrever um script que emula um terminal e compõe cada fluxo de saída de forma independente e, em seguida, recompõe-os juntos em um único fluxo, mas não ouvi falar de ninguém que tenha tentado isso antes.

    
por 11.11.2016 / 22:12
0

Este é um tipo de hacky e irá enviar spam para o seu ecrã, pelo que a rolagem para trás não será fácil, mas deverá funcionar.

#!/bin/bash
output1=$(mktemp /tmp/tmpout.XXXXXX)
output2=$(mktemp /tmp/tmpout.XXXXXX)
./script1 &> $output1 &
pid1=$!
./script2 &> $output2 &
pid2=$!

while [ -d "/proc/$pid1" ] || [ -d "/proc/$pid2" ]
do
   clear
   tail -n 1 $output1
   tail -n 1 $output2
   sleep 1
done
rm -f $output1 $output2
    
por 11.11.2016 / 22:23