바이너리 경로를 전달하고 모든 앱이 백그라운드에서 실행되는 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 및 트랩의 배열 목록을 유지한 다음 트랩 핸들러가 모든 하위 프로세스를 종료합니다.