PID가 종료되면 실행 중인 것으로 알려진 PID를 종료하는 방법은 무엇입니까?

PID가 종료되면 실행 중인 것으로 알려진 PID를 종료하는 방법은 무엇입니까?

바이너리 경로를 전달하고 모든 앱이 백그라운드에서 실행되는 script.sh가 있습니다.

./script.sh path/to/app_1 path/to/app_2 ... path/to/app_n

스크립트는 다음과 같습니다.

#!/bin/bash

for app in "$@"
do
    $app &
done

내 모든 응용 프로그램은 예상대로 실행됩니다. 그 중 일부는 창이 없는 콘솔 애플리케이션이지만 일부는 인터페이스가 있어 창 애플리케이션을 닫을 수 있습니다.

다음과 같이 애플리케이션의 PID를 얻을 수 있습니다.

pgrep "${app##*/}"

script.bash를 통해 매개변수로 전달한 pid를 사용하여 모든 애플리케이션을 어떻게 종료할 수 있나요? 창 중 하나를 닫으면 알려진 실행 중인 응용 프로그램이 모두 종료됩니다.

답변1

이것은 작동합니다.

declare -a _procid

_kill_them_all()
{
    for p in ${_procid[@]} ; do
        kill -9 $p 2>/dev/null
    done
    exit
}

trap _kill_them_all SIGCHLD

for app in "$@"
do
    $app  &
    _procid+=($!)
done

wait ${_procid[@]}

echo "doesn't get here if there were children"

bash 스크립트는 하위 프로세스가 종료될 때 하위 pid 및 트랩의 배열 목록을 유지한 다음 트랩 핸들러가 모든 하위 프로세스를 종료합니다.

관련 정보