다음과 같은 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
첫 번째 루프에서 시작된 모든 하위 프로세스가 종료된 후에만 두 번째 루프가 실행됩니다.wait
for
for
for
간단한 것을 사용하십시오
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