誤動作するアプリケーションが終了した後に残されたプロセスを自動的に終了する方法は?

誤動作するアプリケーションが終了した後に残されたプロセスを自動的に終了する方法は?

一部のアプリケーションは完全に終了せず、プ​​ロセスはそのまま残ります。私が見つけた1つの例はFoxit Readerです。もちろん、バグを報告してアプリケーションを修正するのが最も理想的な状況ですが、これが不可能な場合もあります。たとえば、Foxit Readerの場合、開発者は完全な書き換え作業を進めているので、現在のバージョンを変更しないと述べました。

私はアプリケーションを終了したときに残りのプロセスが自動的に閉じるようにしたいと思います(もちろん、残りのプロセスをさらに作成せずに)。どうすればいいですか?

ベストアンサー1

最も簡単な方法は、スクリプトを介してプログラムを起動し、プロセスグループtrap全体killを設定することです。

#!/bin/bash
trap "kill -9 -- -$$" ERR EXIT
/path/to/gui-programm

どのように動作しますか?

Aはtrapシェル組み込みコマンドです。スクリプトが 1 つ以上のシグナルを受信すると、特定のコマンドを実行します。この場合、EXITは正常なシャットダウン(つまり、GUIプログラムを閉じる)を示し、ERRはエラー(例えば、CTRL+Cまたは他の理由でFoxitが終了した)を示します。参照:man signalman bash

使用されるコマンドはSIGKILLが送信されるkill場所です-9killPIDにマイナス記号を追加して単一のプロセスを終了できます。これはkill <pid>プロセスグループ全体(つまり、プロセスとすべての子プロセスとフォーク)に影響します。--これは、次のパラメータがフラグとして解釈されないようにするために必要です。つまり、kill -9 -- -$pid プロセスグループは一定期間終了します。

$$現在のシェルスクリプトのPID。 GUIプログラムはスクリプトの子プロセスであり、GUIプログラム自体の子プロセスもスクリプトにソースとして接続されているプロセスグループの一部です。

テストしたい場合は、複数の睡眠を使用することをお勧めします。

 #!/bin/bash
 #test script for kill via trap
 trap "kill -9 -- -$$" ERR EXIT
 for (( i=1 ; i<=100 ; i++ )) ; do
   sleep 120
 done
 /path/to/gui-command

GUIコマンドを終了すると、すべてのスリープモードが消えます。トラップセクションをコメントアウトすると、そのまま残ります。


trap子プロセスが失敗しても実行を保証するには継承が必要ですset -E

#!/bin/bash
set -E
trap "kill -9 -- -$$" ERR EXIT
/path/to/gui-programm

おすすめ記事