Diferença na saída do script de shell

1

Estou executando um script de shell simples que tem um loop for e inicia 16 threads no back ground e espera que cada um deles termine antes de passar para os próximos comandos.

Aqui está o shell:

total_threads=16

    echo "" 
    echo "Running Web Exclusive Item updates ... "  
    echo "Total Number of threads = " $total_threads
     for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
     do
        echo "Running Thread $i ..  "
        ./run_upd_web_excl_items.sh $i $total_threads &
     done
     wait
     echo "Done."


    echo ""  
    echo "Committing data ... "
    output_val='$ORACLE_HOME/bin/sqlplus -S $UP <<endofsql
       whenever sqlerror exit 2
       whenever oserror exit 3
       SET HEADING  OFF
       SET FEEDBACK OFF
       SET ECHO     OFF
       set serverout on
      commit;
      /
    exit
    endofsql'
    echo "Done."

Como eu estava executando isso, a saída está vindo da seguinte forma:

~> . ./run_upd_web_excl_items_mitctrl.sh

Running Web Exclusive Item updates ...
Total Number of threads =  16
Running Thread 1 ..
Running Thread 2 ..
Running Thread 3 ..
Running Thread 4 ..
Running Thread 5 ..
Running Thread 6 ..
Running Thread 7 ..
Running Thread 8 ..
Running Thread 9 ..
Running Thread 10 ..
Running Thread 11 ..
Running Thread 12 ..
Running Thread 13 ..
Running Thread 14 ..
Running Thread 15 ..
Running Thread 16 ..
Total time for Thread 3 : 0 minute(s), 22.5 second(s).
Total time for Thread 2 : 0 minute(s), 23.3 second(s).
Total time for Thread 12 : 0 minute(s), 24.3 second(s).
Total time for Thread 8 : 0 minute(s), 24.8 second(s).
Total time for Thread 7 : 0 minute(s), 29.9 second(s).
Total time for Thread 1 : 0 minute(s), 30 second(s).
[1]   Done                    ./run_upd_web_excl_items.sh $i $total_threads
[2]   Done                    ./run_upd_web_excl_items.sh $i $total_threads
[3]   Done                    ./run_upd_web_excl_items.sh $i $total_threads
[7]   Done                    ./run_upd_web_excl_items.sh $i $total_threads
[8]   Done                    ./run_upd_web_excl_items.sh $i $total_threads
[12]   Done                    ./run_upd_web_excl_items.sh $i $total_threads
Total time for Thread 16 : 0 minute(s), 32.1 second(s).
Total time for Thread 4 : 0 minute(s), 32.8 second(s).
[4]   Done                    ./run_upd_web_excl_items.sh $i $total_threads
[16]+  Done                    ./run_upd_web_excl_items.sh $i $total_threads
Total time for Thread 10 : 0 minute(s), 33.2 second(s).
Total time for Thread 13 : 0 minute(s), 33.7 second(s).
Total time for Thread 5 : 0 minute(s), 33.8 second(s).
[5]   Done                    ./run_upd_web_excl_items.sh $i $total_threads
[10]   Done                    ./run_upd_web_excl_items.sh $i $total_threads
[13]   Done                    ./run_upd_web_excl_items.sh $i $total_threads
Total time for Thread 14 : 0 minute(s), 35.6 second(s).
Total time for Thread 6 : 0 minute(s), 36.8 second(s).
[6]   Done                    ./run_upd_web_excl_items.sh $i $total_threads
[14]-  Done                    ./run_upd_web_excl_items.sh $i $total_threads
Total time for Thread 11 : 0 minute(s), 37.7 second(s).
Total time for Thread 9 : 0 minute(s), 37.8 second(s).
[9]   Done                    ./run_upd_web_excl_items.sh $i $total_threads
[11]-  Done                    ./run_upd_web_excl_items.sh $i $total_threads
Total time for Thread 15 : 0 minute(s), 38.8 second(s).
[15]+  Done                    ./run_upd_web_excl_items.sh $i $total_threads
Done.

Committing data ...
Done.

Normalmente, eu esperaria uma saída assim:

~> ./run_upd_web_excl_items_mitctrl.sh

Running Web Exclusive Item updates ...
Total Number of threads =  16
Running Thread 1 ..
Running Thread 2 ..
Running Thread 3 ..
Running Thread 4 ..
Running Thread 5 ..
Running Thread 6 ..
Running Thread 7 ..
Running Thread 8 ..
Running Thread 9 ..
Running Thread 10 ..
Running Thread 11 ..
Running Thread 12 ..
Running Thread 13 ..
Running Thread 14 ..
Running Thread 15 ..
Running Thread 16 ..
Total time for Thread 1 : 0 minute(s), 26.5 second(s).
Total time for Thread 10 : 0 minute(s), 27.1 second(s).
Total time for Thread 2 : 0 minute(s), 27.5 second(s).
Total time for Thread 6 : 0 minute(s), 27.9 second(s).
Total time for Thread 3 : 0 minute(s), 27.9 second(s).
Total time for Thread 15 : 0 minute(s), 27.9 second(s).
Total time for Thread 9 : 0 minute(s), 28 second(s).
Total time for Thread 5 : 0 minute(s), 28 second(s).
Total time for Thread 16 : 0 minute(s), 28.1 second(s).
Total time for Thread 8 : 0 minute(s), 30.5 second(s).
Total time for Thread 12 : 0 minute(s), 31 second(s).
Total time for Thread 11 : 0 minute(s), 31.5 second(s).
Total time for Thread 7 : 0 minute(s), 31.9 second(s).
Total time for Thread 14 : 0 minute(s), 32 second(s).
Total time for Thread 13 : 0 minute(s), 32.7 second(s).
Total time for Thread 4 : 0 minute(s), 34.8 second(s).
Done.

Committing data ...
Done.

Não consigo descobrir por que o shell está imprimindo as linhas extras como:

[13]   Done                    ./run_upd_web_excl_items.sh $i  $total_threads

Alguma opinião?

    
por Suddha 02.09.2014 / 20:51

2 respostas

2

É porque você está executando o script com . script_name . O shell (seu shell principal interativo) está tratando os comandos neste arquivo como se você estivesse digitando-os manualmente no prompt do shell. As mensagens que você está vendo são aquelas que o shell normalmente exibe quando um processo de segundo plano primário (ou seja, um lançado diretamente do shell principal) termina.

A menos que você tenha algum motivo específico para fazer isso, Eu sugiro que você execute o script com

sh run_upd_web_excl_items_mitctrl.sh

(ou use bash se você precisar) ou torne-o executável com

chmod +x run_upd_web_excl_items_mitctrl.sh

e depois executá-lo com

./run_upd_web_excl_items_mitctrl.sh
    
por 02.09.2014 / 21:20
2

O motivo é porque eles estão sendo executados no segundo plano de seu shell atual .

Quando você usa . ou source para executar um script, ele não é executado em um subshell, é exatamente como se você digitasse os comandos diretamente no seu terminal.

Adicione #!/bin/bash como a primeira linha do seu script e execute-o diretamente em vez de fazer o sourcing.

    
por 02.09.2014 / 21:20

Tags