web-dev-qa-db-ja.com

$によってキャプチャされないbashプロセスのPID!

スクリプトのこの部分は正常に動作しますが、

geany &
pid=$!
...
kill -KILL $pid

代わりに、これはしません。

lxterminal &
pid=$!
...
kill -KILL $pid

バックグラウンドにbashプロセスが残っているように見えますが、$pidでは識別されません。後でプロセスを強制終了できるように、ターミナルウィンドウのPIDを取得するにはどうすればよいですか?

注:私もその名前でそれを殺そうとしましたが、--titleオプションはPrompt_COMMANDとのある種の競合を引き起こします。

2
nightcod3r

もちろん、lxterminalは子プロセスを分岐させます。それについて考えてください。その子プロセスはエミュレートされた端末に接続されている対話型シェルによってlxterminal(または-eオプションで提供されている代替プログラム)です。そのシェルで実際に行ったことに応じて、孫プロセスがさらに作成されます。

lxterminalを強制終了すると、使用する疑似端末のマスター側が閉じます。これは、スレーブ側に関する限り、端末のハングアップのように見えます。スレーブ側は、インタラクティブシェルがその制御端末と見なすものです。したがって、シェルは通常の端末のハングアップを確認し、端末の-hupcl設定がオンの場合、セッションリーダーにSIGHUPを生成する必要があります。そのセッションリーダーは、そのシェルプロセスです。

セッションリーダーは、セッション内のジョブ制御、およびすべてのジョブにハングアップ信号を渡す責任があります。明らかに、シェルによってdisownedが実行されているか、またはNohuppedされている場合、セッションリーダーはハングアップシグナルを渡さず、lxterminalが終了し、疑似ターミナルのマスター側が終了しても、何かが引き続き実行されます。閉まっている。それがdisownNohupdoです。

疑似端末が切断されたときに、その対話型セッションで実行しているものが何であれ、死なない理由を整理する必要があります。あなたはそれが何であるかについて私たちに何も言っていません、そして私たちはテレパシーではありません。したがって、セッションリーダーシェルが何を行うように設計されているかについて、一般性を超えて提案することはほとんどありません。

1
JdeBP

@ 9000がコメントに入れているので、lxterminalが再びフォークしている可能性があります。新しいフォークのプロセスIDを取得するのは難しいため、$!が機能していません。

0
InitializeSahib

これはうまくいくかもしれません。しかし、私はそれをテストしていません。

lxterminal &
pid=$!
kill -KILL "$(ps -ho ppid,pid | grep ^$pid | cut -d' ' -f2)"
  • ps -ho ppid,pidは、現在実行されているプロセスのPPID(親PID)とPIDを取得します。
  • 次に、grep ^$pid$pidによってforkされていないものを除外するため、バックグラウンドでlxterminalを使用します。
  • 最後に、cutは孫のPIDを選択します。
0
user147505