여러 프로세스를 기다리고 프로세스가 종료되면 종료 코드를 인쇄합니다.

여러 프로세스를 기다리고 프로세스가 종료되면 종료 코드를 인쇄합니다.

여기서 달성하려는 것은 스크립트를 통해 3개의 서로 다른 사용자 정의 응용 프로그램을 동시에 실행하고 기다린 후 응용 프로그램이 종료되면 알림을 통해 경고를 받거나 종료 코드를 인쇄한다는 것입니다.

사용 시스템: Centos 6.8

답변1

(4.3 이상) wait의 명령에는 다음 옵션이 있습니다.bash-n

-n이 옵션이 제공 되면 wait는 작업이 종료될 때까지 기다렸다가 종료 상태를 반환합니다.

이것은 당신이 할 수 있다는 것을 의미합니다

command1 &
command2 &
command3 &

wait -n
printf 'One command exited with exit code %d\n' "$?"

답변2

wait -n다음과 같이 하위 프로세스가 종료될 때까지 기다린 다음 각 하위 프로세스가 아직 실행 중인지 테스트하여 kill -0방금 종료된 하위 프로세스를 확인할 수 있습니다 .

for f in 15 10 15; do
    sleep $f &
    PIDS+="$! "
done
wait -n
for f in $PIDS; do
    if ! kill -0 $f 2> /dev/null; then
        echo $f
    fi
done

wait -n원래 상태 가 아닌 하위 프로세스의 종료 상태만 반환됩니다 PID.

답변3

Bash를 고려했지만 wait -n어떤 하위 프로세스가 종료되었는지 알려주지 않습니다. 간단한 Perl 스크립트는 어떻습니까?

#!/usr/bin/perl

use strict;
use warnings;
use POSIX ":sys_wait_h";

sub spawn(@) {
    my $pid = fork();
    die "fork: $!" if not defined $pid;
    if ($pid == 0) {
        exec @_ or die "exec: $!";
    }
    return $pid;
}

# Commands to run
my $p1 = spawn '/bin/bash -c "sleep 6; kill $$"';
my $p2 = spawn '/bin/bash -c "sleep 4; exit 4"';

print "spawned PIDs $p1 and $p2\n";

while ((my $child = waitpid(-1, 0)) > 0) {
    my $code = $? >> 8;
    my $status = $? & 0xff;
    printf "child %d finished with exit code %d (status/sig %d)\n", $child, $code, $status;
}

답변4

Bash 5.1 이상을 사용하면 다음을 수행할 수 있습니다.

while
  wait -np id
  status=$?
  [ -n "$id" ]
do
  echo "process of ID $id exited with status $status"
done
bash-5.2$ 도움말 대기 중
기다리다:기다리다[-에프N] [-p 변수] [ID...]
    작업이 완료되고 종료 상태가 반환될 때까지 기다립니다.

    프로세스 ID 또는 ID일 수 있는 ID로 식별된 각 프로세스를 기다립니다.
    작업 사양을 확인하고 종료 상태를 보고합니다. 신분증이 아닌 경우
    주어진 경우, 현재 활성화된 모든 하위 프로세스를 기다린 다음 반환합니다.
    상태는 0입니다. ID가 작업 사양인 경우 모든 프로세스를 기다립니다.
    이번 작업의 흐름상.

    -n 옵션이 제공되면 ID 목록에서 단일 작업을 기다립니다.
    또는 ID가 제공되지 않은 경우 다음 작업을 완료하고 해당 ID를 반환합니다.
    종료 상태.

    -p 옵션이 제공되면 작업의 프로세스 또는 작업 식별자
    반환된 종료 상태는 변수 VAR에 할당됩니다.
    옵션 매개변수로 이름이 지정됩니다. 이 변수는 처음에는 설정 해제됩니다.
    모든 임무. 이는 -n 옵션이 제공되는 경우에만 유용합니다.

    -f 옵션이 제공되고 작업 제어가 활성화된 경우 기다립니다.
    상태가 변경될 때까지 기다리지 않고 종료할 ID를 지정합니다.

    종료 상태:
    ID가 유효하지 않거나 잘못된 경우 마지막 ID의 상태를 반환합니다.
    옵션이 주어지거나, -n이 제공되고 쉘에 기다리지 않은 옵션이 없는 경우
    어린이들.

관련 정보