^Cを使用してバックグラウンドプロセスを閉じてから(効果的に)フォアグラウンドプロセスを閉じる機能を再取得します。

^Cを使用してバックグラウンドプロセスを閉じてから(効果的に)フォアグラウンドプロセスを閉じる機能を再取得します。

インタラクティブコンソールでを押してZenityウィンドウを^C閉じます。スクリプトでのみ使用zenity --info & fgできます。zenity --info & waitただし、^Cこの場合、Zenityウィンドウは閉じません。もっと仕事waitのように振る舞う方法はありますか?fg^C

ベストアンサー1

あなたができる最も簡単なことは、ハンドラSIGINTでバックグラウンドプロセスをキャッチして(^ C)殺すことです:

#! /bin/sh
trap 'kill "$!"; exit 1' INT QUIT
zenity --info &
wait

バラよりこれそして他の類似回答この行動の説明。

一部のシェルでスクリプトを呼び出す場合、たとえばbashいわゆる「待って協力していきましょう」(望むよりここ議論のために)シグナルを受信した後にプログラムが完全にシャットダウンされると予想される方法は、ハンドラーをリセットしてから同じシグナルでセルフシャットダウンすることです。

#! /bin/sh
termsig(){ trap - "$1"; kill "$!"; kill -s "$1" "$$"; }
trap 'termsig INT' INT
trap 'termsig QUIT' QUIT 
zenity --info &
wait

もちろん、これらすべては非常に粗雑であり、それ自体が生成できるサブプロセスでzenityは何もしません。複数のバックグラウンドプロセスに合わせて調整する必要があります。より確実な解決策は(trap - INT; zenity --info) &次のとおりです。いいえ/bin/shDebian派生ディストリビューション(Ubuntuなど)またはbusyboxベースのシステムで動作します。

SIGINT別の解決策は、設定をデフォルト値にリセットできるラッパーを介してプログラムを実行することです。そしてperl

#! /bin/sh
perl -e '$SIG{INT} = $SIG{QUIT} = "DEFAULT"; exec @ARGV' zenity --info &
wait

perlただし、そうすることで、またはpython;-)を使用してスクリプト全体を再構築することもできます。

おすすめ記事