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

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

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

사용시스템 : Centos 6.8

답변1

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

옵션이 제공 되면 -nwait는 작업이 종료될 때까지 기다리고 종료 상태를 반환합니다.

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

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 var] [ID...]
    작업 완료를 기다리고 종료 상태를 반환합니다.

    프로세스 ID 또는 ID일 수 있는 ID로 식별되는 각 프로세스를 기다립니다.
    작업 사양을 작성하고 종료 상태를 보고합니다. 아이디가 아닌 경우
    주어지면 현재 활성화된 모든 하위 프로세스를 기다리고 반환됩니다.
    상태는 0입니다. ID가 작업 사양인 경우 모든 프로세스를 기다립니다.
    해당 작업의 파이프라인에서

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

    -p 옵션이 제공되면 작업의 프로세스 또는 작업 식별자
    종료 상태가 반환되는 항목은 변수 VAR에 할당됩니다.
    옵션 인수로 명명됩니다. 변수는 처음에 설정 해제됩니다.
    어떤 임무라도. 이는 -n 옵션이 제공되는 경우에만 유용합니다.

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

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

관련 정보