別のターミナルウィンドウ(タブ)で複数の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