私は現在、大規模プラットフォームの監査スクリプトを書いています。デフォルトのスクリプトはトラップを使用し、トラップの1つはユーザーにファイルをクリーンアップするように要求します。スクリプトには標準出力の出力がないため、bgでスクリプトを実行することは明らかです。
fg
SIGQUITをbg-jobに送信すると停止し、プロンプトを取得するには手動でフォアグラウンドにインポートする必要があります。
私が試したこと:set -m
アクティブな職業管理を試してみて、fg
私のトラップ機能に入れました。
スクリプトが完了するとシェルが閉じ、スクリプトが存在しない場合、スクリプトset -m
にジョブ制御がないことを示すデバッグ出力が表示されます。を使用しても、ジョブset -m
は前景として表示されません。
このために私の質問は次のとおりです。
- 特定の瞬間に作業を強制的に前面に表示できますか?
- 私はこれがスクリプトでジョブ制御を使用する一般的な方法ではないことを知っています。これに関する「ベストプラクティス」とは何ですか?
- スクリプト内のジョブ制御はサブシェル/サブプロセスに対してのみ機能しますか、それを使用して開始するジョブを制御できますか?
編集する:screen
lcd047が提案したように、orを使用する方がエレガントでスクリプトをtmux
きれいでシンプルに保ちます。
答え1
スクリプト内のジョブ制御はサブシェル/サブプロセスに対してのみ機能しますか、それを使用して開始するジョブを制御できますか?
はい。ジョブ制御は親シェルによって実行されるため、その内部で子プロセスをフォアグラウンドにインポートすることはできません。
編集する:しかし、まだ次のようにすることができます。
下付き文字:
#! /bin/sh ... trap "kill -s USR1 $PPID" TTOU ... echo -n Cleanup? read yn </dev/tty ...
親スクリプト:
#! /bin/sh ... trap "fg %1" USR1 ... child & ... wait ...
これにより、SIGTTOU
子に1つのシグナルハンドラがインストールされ、SIGUSR1
親に別のシグナルハンドラがインストールされます。子プロセスが端末に何かを出力しようとすると、を受信して上位に送信し、親SIGTTOU
プロセスがSIGUSR1
実行され、fg %1
子プロセスを前景にインポートします。
上記は%1
子プロセスであると仮定します。実際にはとにかくバックグラウンドにプロセスがあるかもしれません。