4

Linuxでbashを使用すると、フォアグラウンドで並列プロセスを生成できますか?たとえば、次のとおりです。

top.sh

#!/bin/bash

./myscript1.sh &
./myscript2.sh &

バックグラウンドスレッドとして2つのプロセスを並行して生成します。しかし、これらを前景スレッドとしてスポーンすることは可能ですか?目的は、 top.shが強制終了されたときに、myscript1.shmyscript2.shを自動的に強制終了することです。ありがとう

4

2 に答える 2

7

フォアグラウンドで実行できるジョブは 1 つだけです。スクリプトに到達したシグナルに反応させ、そのシグナルを他のジョブに転送することができます。サブプロセスを強制終了する中心的な方法が必要な場合は、スクリプトが残っていることを確認する必要があります。waitすべてのジョブが終了するか、スクリプト自体が強制終了されるまでスクリプトが終了しないように呼び出します。

#!/bin/bash
jobs=
trap 'kill -HUP $jobs' INT TERM HUP
myscript1.sh & jobs="$jobs $!"
myscript2.sh & jobs="$jobs $!"
wait

SIGQUIT (意図的に除外) や SIGKILL (キャッチできない) など、キャッチしないシグナルを送信することで、ラッパー スクリプトのみを強制終了することもできます。

すべてのプロセスをフォアグラウンドに置く方法があります: パイプを介してそれらを接続します。プロセスの終了によって前のプロセスが強制終了されないように、SIGPIPE を無視します。必要に応じて、他のファイル記述子を介して stdin および stdout を保存および復元します。このように、スクリプトとバックグラウンド タスクは同じプロセス グループCtrlにあるため、 +を押すCと、ラッパー スクリプトとサブプロセスの両方が強制終了されます。ラッパー スクリプトを直接強制終了しても、サブプロセスには影響しません。代わりに、ラッパー スクリプトの PID の負の値を渡すことで、プロセス グループを強制終了できます (例: kill -TERM -1234)。

trap '' PIPE
{
  myscript1.sh <&3 >&4 |
  myscript2.sh <&3 >&4
} 3<&0 4>&1
于 2012-08-18T12:51:21.263 に答える
0

GNU Parallel を使用すると、スクリプトは次のようになります。

#!/bin/bash

parallel ::: ./myscript1.sh ./myscript2.sh

あるいは:

#!/usr/bin/parallel --shebang -r

./myscript1.sh
./myscript2.sh

詳細については、紹介ビデオをご覧ください: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

于 2012-08-20T08:52:58.317 に答える