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

関連情報