`wait`는 `wget --Background`를 기다리지 않습니다.

`wait`는 `wget --Background`를 기다리지 않습니다.

유닉스 대기 명령에 관한 여러 SE 게시물을 찾아봤지만 그 중 어느 것도 내 문제를 해결하지 못했습니다. 실행할 일기예보 모델이 있습니다. 먼저 일부 폴더를 준비한 다음 wget을 사용하여 데이터를 다운로드한 다음 예측을 실행합니다. 속도가 느리기 때문에 데이터 다운로드에 최대 30~60분이 소요될 수 있습니다. 데이터 다운로드가 시작되면 데이터가 준비되기 전에 프로그램이 명령을 실행합니다. 다음은 실행을 시작하기 위한 내 crontab 항목입니다.

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

9월 15일에 일간, 주간, 월간으로 실행됩니다.

wrf_run_00.sh에서 실행할 파일은 다음과 같습니다.

!/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

모델을 실행하기 위한 나머지 명령은 다음과 같습니다. 어떤 도움이라도 대단히 감사하겠습니다.

답변1

wait$!구문 오류입니다. 공백이 누락되었습니다. 실제로 백그라운드 작업을 시작하지 않아 $!공백으로 유지되고 명령이 인수를 사용하지 않고 모든 백그라운드 작업을 기다리기 때문에 여기서는 아무런 효과가 없습니다. wait백그라운드 작업이 없기 때문에 즉시 반환됩니다.

wget --background …와 를 사용하는 것에는 차이가 있습니다 wget … &. 첫 번째 명령은 wget하위 프로세스를 포크한 후 종료하도록 지시합니다.

(bash)

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

상위 wget프로세스(즉, 전경)가 반환되면 bash는 프로세스 실행을 재개합니다. 를 사용하면 wget … &셸은 백그라운드 프로세스를 분기합니다.

(bash)

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

                           download

이 경우 wget 프로세스가 종료될 때까지 기다릴 수 있습니다.

wget … &
wait $!

그러나 이는 말이 되지 않습니다. 단지 백그라운드 작업을 시작하여 기다리기만 하는 것은 포그라운드 작업을 시작하는 것과 동일합니다.

wget …

답변2

제안한대로 모두 명령을 시도해 볼 수 있습니다

wait
#instead of 
wait$!

wait$!아마도 당신이 원하는 명령이 사용 중인지 의심스럽기 때문입니다.wait $!

또는 cron 스크립트이므로 --background이 명령을 백그라운드에 두는 대신 완료될 때까지 기다리고 싶기 때문에 wget 옵션을 비활성화할 수 있습니다.

답변3

시도해 보셨나요 wait{!}? 계속하기 전에 모든 백그라운드 프로세스가 완료될 때까지 기다립니다.

관련 정보