백그라운드에서 여러 프로그램을 실행하고 반환 값을 확인하세요.

백그라운드에서 여러 프로그램을 실행하고 반환 값을 확인하세요.

다음과 같이 여러(가령 3개) 프로그램을 동시에 실행하고 싶다고 가정해 보겠습니다.

program1 & program2 & program3 &

알고 싶다면 pid's이렇게 보관해 두는 게 가장 좋은 방법인 것 같아요

program1 &
pid1=$!
program2 &
pid2=$!
...

하지만 이제 종료되었는지 알고 싶으면 어떤 값을 반환합니까? 이 같은:

if [ program1 has ended ]; then
    do something with its return value
fi

어떤 도움이라도 대단히 감사하겠습니다.

답변1

# launch child process in background
launch_child_process &

# grab child's pid and store it (use array if several)
pid=$!

# later, wait for termination
wait $pid
# show return code from wait, which is actually the return code of the child
echo "Child return code:" $?

자식이 여러 개인 경우 각 PID에 대해 루프를 기다리고 해당 반환 코드를 수집할 수 있습니다. 마지막 하위 프로세스가 끝나면 루프를 종료할 수 있습니다.

답변2

간단한 해결책은 메시지를 로그 파일에 기록하는 것입니다.

예를 들어 프로그램 1의 경우 다음 작업을 수행합니다.

#!/bin/bash
.
.
your stuff
.
.
end_time==$(date)
echo "program1 ended at $end_time" > program1_log

또 다른 아이디어는 프로세스의 끝을 표시하기 위해 빈 파일을 만드는 것입니다.

#!/bin/bash
.
.
your stuff
.
.
echo $? > /some/path/program1_ended #storing the exit value
#disadvantage is that you can't verify if intermediate commands failed.

그런 다음 할 일을 확인하세요.

   if [ -e /some/path/program1_ended ]
   then
   exit_status=$( </some/path/program1_ended )
   rm /some/path/program1_ended #Deleting the file, getting ready for next run
   .
   .
   Do something
   else
   echo "program1 has not ended yet"
  fi

답변3

POSIX sh는 여러 백그라운드 프로세스를 처리하는 데 그다지 능숙하지 않습니다. 기본 도구는 wait백그라운드 프로세스가 종료될 때까지 차단하는 내장 도구입니다. 하지만 wait그 전까지는 아무런 이의가 없습니다.모두백그라운드 프로세스가 종료되었으며 마지막으로 종료된 프로세스의 종료 상태가 반환됩니다. 다른 하위 프로세스의 종료 상태는 손실됩니다.

프로세스의 하위 프로세스가 종료될 때 발생하는 신호인 SIGCHLD에 대한 트랩을 설정할 수 있습니다. 하위 프로세스가 종료될 때마다 코드가 실행됩니다. 그러나 어떤 하위 프로세스가 종료되었는지 또는 해당 프로세스의 반환 상태가 무엇인지 반드시 알 수는 없습니다. 다른 껍질은 다르게 동작합니다.

ATT ksh93(mksh 또는 pdksh 아님!)은 SIGCHLD 트랩을 효과적으로 처리할 수 있는 유일한 일반 셸입니다. $!종료 프로세스의 PID와 반환 상태를 설정합니다 $?.

#!/bin/ksh
trap 'Process $! (${subprocesses[$!]}) exited with status $?' CHLD
typeset -A subprocesses
program1 & subprocesses[$!]='program1'
program2 & subprocesses[$!]='program2'
wait

다른 셸을 사용하는 경우 사후 처리를 하위 프로세스에 넣으세요.

#!/bin/sh
{ program1; echo "program1 exited with status $?"; } &
{ program2; echo "program2 exited with status $?"; } &
wait

또는 Perl, Python, Ruby 등과 같은 보다 강력한 언어를 사용하십시오.

답변4

wait <pid>프로세스가 종료되는 순서를 대략적으로 알고 있는 경우 프로세스가 종료될 때까지 대기를 사용할 수 있으며 wait명령은 대기 중인 프로세스의 종료 상태를 상속합니다. 예를 들어

if wait $pid1
then echo "$pid1 was ok"
else echo "$pid1 failed with code $?"
fi

순서를 모르는 경우에는 wait를 사용하여 wait -n $pid1 $pid2 ...유사한 방식으로 종료 코드를 얻을 수 있지만 어떤 프로세스가 종료되었는지는 알 수 없지만, 실패.

관련 정보