スクリプトのこの部分は正常に動作しますが、
geany &
pid=$!
...
kill -KILL $pid
代わりに、これはしません。
lxterminal &
pid=$!
...
kill -KILL $pid
バックグラウンドにbashプロセスが残っているように見えますが、$pid
では識別されません。後でプロセスを強制終了できるように、ターミナルウィンドウのPIDを取得するにはどうすればよいですか?
注:私もその名前でそれを殺そうとしましたが、--title
オプションはPrompt_COMMAND
とのある種の競合を引き起こします。
もちろん、lxterminal
は子プロセスを分岐させます。それについて考えてください。その子プロセスはエミュレートされた端末に接続されている対話型シェルによってlxterminal
(または-e
オプションで提供されている代替プログラム)です。そのシェルで実際に行ったことに応じて、孫プロセスがさらに作成されます。
lxterminal
を強制終了すると、使用する疑似端末のマスター側が閉じます。これは、スレーブ側に関する限り、端末のハングアップのように見えます。スレーブ側は、インタラクティブシェルがその制御端末と見なすものです。したがって、シェルは通常の端末のハングアップを確認し、端末の-hupcl
設定がオンの場合、セッションリーダーにSIGHUP
を生成する必要があります。そのセッションリーダーは、そのシェルプロセスです。
セッションリーダーは、セッション内のジョブ制御、およびすべてのジョブにハングアップ信号を渡す責任があります。明らかに、シェルによってdisown
edが実行されているか、またはNohup
pedされている場合、セッションリーダーはハングアップシグナルを渡さず、lxterminal
が終了し、疑似ターミナルのマスター側が終了しても、何かが引き続き実行されます。閉まっている。それがdisown
とNohup
doです。
疑似端末が切断されたときに、その対話型セッションで実行しているものが何であれ、死なない理由を整理する必要があります。あなたはそれが何であるかについて私たちに何も言っていません、そして私たちはテレパシーではありません。したがって、セッションリーダーシェルが何を行うように設計されているかについて、一般性を超えて提案することはほとんどありません。
@ 9000がコメントに入れているので、lxterminal
が再びフォークしている可能性があります。新しいフォークのプロセスIDを取得するのは難しいため、$!
が機能していません。
これはうまくいくかもしれません。しかし、私はそれをテストしていません。
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を選択します。