'wait' não espera por 'wget --background'

1

Eu passei por várias postagens SE no comando unix wait e nenhuma das postagens resolveu o meu problema. Eu tenho um modelo de previsão do tempo para ser executado. Primeiro, é necessário preparar algumas pastas, fazer o download dos dados usando o wget e executar a previsão. O download de dados pode levar até 30 a 60 minutos devido à baixa velocidade. O que acontece é que, quando o download de dados é iniciado, o programa avança para executar os comandos antes que os dados estejam prontos. Abaixo está minha entrada crontab para iniciar a corrida

15 09 * * * /bin/bash /home/zmumba/WRF/SCRIPTS/wrf_run_00.sh &

Funciona às 09h15 todos os dias, todas as semanas e todos os meses.

Os arquivos a serem executados em wrf_run_00.sh são

!/bin/bash
year='date "+%Y"'
month='date "+%m"'
day='date "+%d"'
 source /home/zmumba/.bashrc

perl /home/zmumba/WRF/SCRIPTS/wrf_Namelists_and_Dirs_00_Daily.pl
perl /home/zmumba/WRF/SCRIPTS/download-file_gen00.pl

wget --directory-prefix=/home/zmumba/WRF/DATA/${year}${month}${day}00 --background --continue --progress=bar --input-file=/home/zmumba/WRF/SCRIPTS/download-file-list-one_deg_00.txt

 wait$!

cd /home/zmumba/WRF/WPS

e o restante dos comandos para executar o modelo segue. Qualquer ajuda será apreciada.

    
por Zilore Mumba 02.04.2014 / 09:43

3 respostas

3

Como sugerido, você pode tentar o comando

wait
#instead of 
wait$!

porque eu realmente duvido que exista algum comando chamado wait$! , talvez o que você queira aqui esteja usando wait $!

ou como é um script cron você pode talvez desabilitar a opção de wget --background porque você quer esperar pelo final desse comando e não colocá-lo em segundo plano.

    
por 02.04.2014 / 10:03
3

wait$! é um erro de sintaxe, você está perdendo um espaço. Isso não tem nenhum impacto aqui porque você nunca inicia uma tarefa em segundo plano, então $! permanece vazio e o comando é wait sem argumento, que aguarda todos os trabalhos em segundo plano - e como não há nenhum, ele retorna imediatamente.

Há uma diferença entre usar wget --background … e wget … & . O primeiro comando diz wget para bifurcar um processo filho e, em seguida, sair:

(bash)

  fork ——————————————→
  wait                  exec wget --background …
   ⋮
   ⋮                    fork ———————————————————————→
      ←——————————————   exit                           download
  (next script line)                                             ⋮

Quando o pai wget process (que é um primeiro plano) retorna, bash retoma a execução do processo. Com wget … & , o shell cria um processo em segundo plano:

(bash)

  fork ——————————————————→
  (next script line)       exec wget --background …

                           download
                            ⋮

Nesse caso, você pode aguardar o processo do wget sair:

wget … &
wait $!

No entanto, isso é inútil: iniciar um trabalho em segundo plano apenas para esperar é equivalente a iniciar um trabalho em primeiro plano.

wget …
    
por 03.04.2014 / 01:14
-1

Você já tentou wait{!} ? Ele aguardará que todos os processos em segundo plano sejam concluídos antes de prosseguir.

    
por 03.04.2014 / 03:52