プロセスコンテナを作成しようとしています。コンテナは他のプログラムをトリガーします。例–「&」を使用して実行中のバックグラウンドタスクを起動するbashスクリプト。
私が求めている重要な機能はこれです。コンテナを殺すと、その下にスポーンされたすべてのものを殺す必要があります。直接の子供だけでなく、その子孫も。
このプロジェクトを開始したとき、プロセスを強制終了すると、その子も自動的に強制終了されると誤って信じていました。同じ間違った考えを持っている人にアドバイスを求めました。信号をキャッチして子供たちに殺害を渡すことは可能ですが、それは私がここで探しているものではありません。
xtermを閉じると、xterm内で実行されていたものはすべて、nohupされていない限り殺されるため、私が達成したいことを信じています。これには、孤立したプロセスが含まれます。それが私が再現しようとしているものです。
私が探しているのはUNIXセッションに関係していると思います。
プロセスのすべての子孫を識別する信頼できる方法があれば、それらに任意の信号を送信できると便利です。例えばSIGUSR1。
承認された回答:
プロセスにシグナルを送信すると、そのプロセスは強制終了されます。プロセスを殺すと他のプロセスも殺すという噂がどのように始まったのだろうか、それは特に直感に反しているようだ。
ただし、複数のプロセスを強制終了する方法があります。ただし、1つのプロセスにシグナルを送信することはありません。 -1234に信号を送信することにより、プロセスグループ全体を強制終了できます。1234は、プロセスグループリーダーのPIDであるPGID(プロセスグループID)です。パイプラインを実行すると、パイプライン全体がプロセスグループとして開始されます(アプリケーションは setpgid
を呼び出すことでこれを変更できます またはsetpgrp
。
バックグラウンドでプロセスを開始する場合( foo&
)、彼らは独自のプロセスグループに属しています。プロセスグループは、端末へのアクセスを管理するために使用されます。通常、フォアグラウンドプロセスグループのみがターミナルにアクセスできます。バックグラウンドジョブは同じセッションに残りますが、セッション全体を強制終了したり、セッション内のプロセスグループやプロセスを列挙したりする機能がないため、あまり役に立ちません。
端末を閉じると、カーネルはシグナル SIGHUP
を送信します それを制御端末として持つすべてのプロセスに。これらのプロセスはセッションを形成しますが、すべてのセッションに制御端末があるわけではありません。したがって、プロジェクトの場合、スクリプトや画面などで作成された独自のターミナルですべてのプロセスを開始することが1つの可能性です。ターミナルエミュレータプロセスを強制終了して、含まれているプロセスを強制終了します( setsid で分離されていない場合)。コード> 。
他に何もしない独自のユーザーとしてプロセスを実行することで、より多くの分離を提供できます。次に、すべてのプロセスを簡単に強制終了できます。 kill
を実行します。 (システムコールまたはユーティリティ)そのユーザーとして、殺すためのPID引数として-1を使用します。これは、「そのユーザーのすべてのプロセス」を意味します。
含まれているプロセスを実際のコンテナで実行することにより、さらに多くの分離を提供できますが、セットアップはかなり多くなります。