별도의 터미널 창(탭)에서 여러 bash 스크립트를 실행하고 있습니다. 나는 그것들을 혼합하여 동일한 창에서 실행하고 혼합 출력을 제공하고 싶습니다. 동일한 창에서 모든 스크립트를 독립적으로 실행하면 됩니다.
일반적인 해결책은 다음 &
과 같이 사용하는 것입니다.
./script1 &
./script2 &
./script3
하지만 터미널에서 제어할 수 없기 때문에 백그라운드에서 작동하도록 스크립트를 보내고 싶지 않습니다. 예를 들어, Ctrl+C
백그라운드 프로세스가 종료되지 않기 때문에 이 스크립트를 종료할 수 없습니다 Ctrl+C
.
답변1
답변2
주위에 래퍼 스크립트를 작성하고 모두 배경으로 보낸 다음 Ctrl+C를 캡처할 수 있습니다.
#!/bin/bash
trap ctrl_c INT
scripts=( ./script1.sh ./script2.sh ./script3.sh )
ctrl_c () {
printf 'Found [%i] PIDs running\n' "${#pids[@]}"
for pid in "${pids[@]}"; do
printf 'Killing PID: %i\n' "$pid"
kill "$pid"
done
}
for script in "${scripts[@]}"; do
"$script" &
pids+=($!)
done
for pid in "${pids[@]}"; do
wait "$pid"
done
따라서 Ctrl+C를 누르면 이전에 캡처한 모든 PID가 종료됩니다.
$ cat ./script{1..3}.sh
#!/bin/bash
sleep 30; echo foo
#!/bin/bash
sleep 30; echo bar
#!/bin/bash
sleep 30; echo baz
$ ./script4.sh
^CFound [3] PIDs running
Killing PID: 48971
Killing PID: 48972
Killing PID: 48973
./script4.sh: line 21: 48971 Terminated: 15 "$script"
./script4.sh: line 21: 48972 Terminated: 15 "$script"
./script4.sh: line 21: 48973 Terminated: 15 "$script"
답변3
노력하다:
parallel -j0 --line-buffer ::: ./script1 ./script2 ./script3