이전 명령이 완료될 때까지 bash 스크립트를 일시 중지합니다.

이전 명령이 완료될 때까지 bash 스크립트를 일시 중지합니다.

다음과 같은 bash 스크립트가 있습니다.

##script
#!/bin/bash
rm data*
rm logfile*
for i in {1..30}
do
## append a & if you want to run it parallel;
nohup Rscript --vanilla main.R 10 100 $i &> logfile"$i" &
done

또 다른 30개의 루프를 계속하기 위해 첫 번째 for 루프 이후에 또 다른 for 루프를 만들고 싶습니다. 예를 들어

##script
#!/bin/bash
rm data*
rm logfile*
for i in {1..30}
do
## append a & if you want to run it parallel;
nohup Rscript --vanilla main.R 10 100 $i &> logfile"$i" &

for i in {31..60}
do
## append a & if you want to run it parallel;
nohup Rscript --vanilla main.R 10 100 $i &> logfile"$i" &
done

새 작업을 시작하기 전에 첫 번째 작업을 끝내고 싶습니다. 그러나 nohup그들은 모두 동시에 실행되는 것처럼 보입니다.

nohup나는 내 서버에 텔넷을 연결하고 그곳에서 작업을 시작한 다음 내 bash를 닫기 때문에 그것을 가지고 있습니다 . 대체 솔루션이 있습니까?

답변1

wait이 작업을 수행하려면 이 명령을 사용해야 합니다 . 모든 하위 프로세스 ID를 캡처하고 구체적으로 기다릴 수 있습니다. 또는 스크립트가 생성하는 유일한 백그라운드 프로세스인 경우 wait인수 없이 직접 호출할 수 있습니다. 예를 들어:

#!/bin/bash
# run two processes in the background and wait for them to finish

nohup sleep 3 &
nohup sleep 10 &

echo "This will wait until both are done"
date
wait
date
echo "Done"

답변2

지금 몇 시지:

  • nohup원격 셸 종료로 인해 작업자 프로세스가 종료되는 것을 방지하는 것이 목표 라면 nohup스크립트가 생성하는 개별 작업자 프로세스가 아닌 스크립트 자체에서 사용해야 합니다.

  • 설명대로여기, nohup프로세스가 SIGHUP을 수신하고 터미널과 상호 작용하는 것을 방지할 뿐이며 셸과 해당 하위 프로세스 간의 관계를 끊지는 않습니다.

  • 위의 사항으로 인해 두 루프 간의 간단한 작업이 있든 없든 nohup첫 번째 루프에서 시작된 모든 하위 프로세스가 종료된 후에만 두 번째 루프가 실행됩니다.waitforforfor

  • 간단한 것을 사용하십시오 wait:

    현재 활성화된 모든 하위 프로세스를 기다리고 상태 0을 반환합니다.

  • for첫 번째 항목에 오류가 없는 경우에만 두 번째 항목을 실행해야 하는 경우 를 사용하여 각 작업자 프로세스 PID를 저장 $!하고 모두 다음으로 전달해야 합니다 wait.

    pids=
    for ...
        worker ... &
        pids+=" $!"
    done
    wait $pids || { echo "there were errors" >&2; exit 1; }
    

답변3

두 루프 사이에 다음과 같은 내용을 삽입하면 for도움이 될 수 있습니다 .

flag=0

while [ flag -eq 0 ]
do
  ps -ef | grep "Rscript --vanilla" | grep -v grep > /dev/null
  flag=${?}
  sleep 10
done

물론 애플리케이션이 Rscript성공적으로 완료되지 않고 중단될 가능성이 있는 경우 두 번째 for 루프가 실행되지 않을 수도 있습니다. 위의 코드 조각은 해당 식별자를 가진 모든 프로세스가 Rscript --vanilla올바르게 완료되고 사라질 것이라고 가정합니다. 귀하의 애플리케이션이 무엇을 하는지, 어떻게 작동하는지 알지 못하기 때문에 저는 이 가정에 의존해야 합니다.

편집하다

리뷰에 따르면 이 옵션이 귀하의 요구에 더 적합할 수 있습니다. (원본 코드와 완료 확인 로직이 포함되어 있습니다)

for i in {1..30}
do
## append a & if you want to run it parallel;
nohup Rscript --vanilla main.R 10 100 $i &> logfile"$i" &
pids[$i]=${!}
done

flag=0

while [ flag -eq 0 ] 
do
  for PID in $(echo ${pids[@]})
  do
    flag=1
    ps -ef | grep ${PID} | grep -v grep >/dev/null; r=${?}
    if [ ${r} -eq 0 ]
    then 
      flag=0
    fi
  done
done

for i in {31..60}
do
## append a & if you want to run it parallel;
nohup Rscript --vanilla main.R 10 100 $i &> logfile"$i" &
done

관련 정보