bash 스크립트를 동시에 실행

bash 스크립트를 동시에 실행

별도의 터미널 창(탭)에서 여러 bash 스크립트를 실행하고 있습니다. 나는 그것들을 혼합하여 동일한 창에서 실행하고 혼합 출력을 제공하고 싶습니다. 동일한 창에서 모든 스크립트를 독립적으로 실행하면 됩니다.

일반적인 해결책은 다음 &과 같이 사용하는 것입니다.

./script1 &
./script2 &
./script3

하지만 터미널에서 제어할 수 없기 때문에 백그라운드에서 작동하도록 스크립트를 보내고 싶지 않습니다. 예를 들어, Ctrl+C백그라운드 프로세스가 종료되지 않기 때문에 이 스크립트를 종료할 수 없습니다 Ctrl+C.

답변1

거의 모든 수의 백그라운드 프로세스에서 tmux 또는 screen에서 스크립트를 실행할 수 있습니다. 언제든지 이러한 프로세스에 액세스할 수 있습니다.

바라보다멀티플렉서또는GNU 화면

답변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

관련 정보