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

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

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

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 -n $pid1 $pid2 ...비슷하게 종료 코드를 얻을 수 있지만 어떤 프로세스가 종료되었는지는 알 수 없지만 실패한 프로세스가 있는지 알아야 하는 경우 유용합니다.

관련 정보