다음과 같이 여러(가령 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 ...
유사한 방식으로 종료 코드를 얻을 수 있지만 어떤 프로세스가 종료되었는지는 알 수 없지만, 실패.