2

ジョブ制御を有効にして stdin を閉じた状態でバックグラウンドで bash スクリプトを実行すると、PARENTシェルが終了します。どうすればそれが起こりますか?

デモンストレーションするには、これを作成しますbackground_bash_script

#!/bin/bash
set -m
ruby -e "puts :here"

次に、bash で実行します。実行したシェルが終了します。Ruby コマンドは重要ではありませんが、コマンドである必要があり、bash 組み込みではないように見えます (たとえば、awk --version動作しますがtrue動作しません)。見やすくするために、さらに別の bash インスタンスで実行してみました。完全なセッションは次のようになります。

parent: PS1='child: ' bash
child: ./background_bash_script <&- &
[1] 3893
child: here
exit
parent:

紛らわしい!

4

1 に答える 1

0

何が起こっているように見えるかはset -m、スクリプトで実行された後、実行される次のコマンドが強制的にフォアグラウンド プロセス グループに置かれ、フォアグラウンド プロセス グループから元のシェルが取り出されるということです。そのプロセスが終了すると、スクリプトを実行しているシェルはフォアグラウンド プロセス グループになりますが、そのシェルが終了すると、元のシェルはスクリプトをバックグラウンドで実行したため、フォアグラウンド プロセス グループに戻りません。これで、バックグラウンド プロセス グループにある対話型シェルができました。

スクリプトがすぐに終了しないようにスクリプトの最後にスリープを設定すると、ここで奇妙な動作が見られます。バックグラウンドでスクリプトを実行すると、ターミナル プロンプトが返されますが、インタラクティブ シェルはフォアグラウンド プロセス グループにありません。何かを入力しようとするとすぐにシェルが終了します。どのメカニズムが終了を引き起こすのか正確にはわかりません。シェルはバックグラウンドにあるため、ターミナルで文字を読み書きしようとすると、SIGTTIN または SIGTTOU が発生するはずですが、これらのシグナルによってシェルが終了することはありません。

于 2013-09-04T06:14:21.873 に答える