유닉스 대기 명령에 관한 여러 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{!}
? 계속하기 전에 모든 백그라운드 프로세스가 완료될 때까지 기다립니다.