子xtermで子プロセスを終了しますが、xtermでは終了しません。

子xtermで子プロセスを終了しますが、xtermでは終了しません。

私はLinuxに初めて触れました。他のファイルにはPythonスクリプトがあり、各スクリプトは必要な機能を実行します。

foo1.py 
foo2.py 
foo3.py

これらのスクリプトはそれぞれ終了する前にクリーンアップする必要があります。また、端末でそれぞれを実行して対話し、出力を別々に読みたいです。

さまざまな終了信号(SIGTERM、SIGINTなど)をキャプチャするためのクリーンアップ機能を実装しました。

端末で各スクリプトを実行するには、以下のように各スクリプトの端末をstartup.sh開いて使用します。xterm

起動ファイル

xterm -e python foo1.py & pid1=$! 
xterm -e python foo2.py &  pid2=$!
xterm -e python foo3.py &  pid3=$!

もしそうなら、私のロジックによるfoo3.pyと、スクリプトが最も重要なので、スクリプトが完了したら、残りの2つを閉じる必要があります。

wait $pid3
kill -15 $pid1
kill -15 $pid2

問題はscript()自体のpidではなくxtermのpid$pid1です。したがって、xterms()を終了すると、Pythonスクリプトはクリーンアップルーチンを実行する機会を取得しません。$pid2foo.pykill -15 $pid

xtermが子プロセス(https://unix.stackexchange.com/a/54994/357513)しかし、Pythonスクリプトはすぐに完了します。

では、得る方法はないだろうか?PIDxterm内で実行されるスクリプトでは?それとも、そのようなクリーンアップルーチンを実行させる他の方法はありますか?

ベストアンサー1

PythonスクリプトもSIGHUPこれをキャッチしてきちんと終了する必要があります。 xtermが実行中の疑似端末を解体すると、それらは1つを取得しますSIGHUP。とにかくこの問題に対処する必要がありますSIGHUP。これは、実行中の端末が明示的xtermにシャットダウンする以外の理由で消える可能性があるためです(X11サーバー自体のシャットダウンなど)。

EIOまた、スクリプトは、マスター端末を持たないスレーブ端末で読み書きするときにエラーを正しく処理する必要があります。

とにかく、次のようにPythonスクリプトを終了できます。

pkill -P $pid1

(「親によって殺された」;参照マンページpkill/ pgrep

すべてのシェルがスクリプトの最後のコマンドをfork / exec / waitから単純なexec(debianなど)に最適化するわけではないので、複雑なdashシェル/bin/shコマンドを実行する必要がある場合のexecように明示的に呼び出すことをお勧めしますxterm -e 'script=$(...); exec python "$script"'

メモ:

WINDOWID質問に正確に答えるわけではありませんが、ターミナルエミュレータで起動されたプロセスを見つける信頼できないが効果的な方法は、その環境で設定されたプロセスを検索することです。

pids_by_env(){ grep -aslP "\b($1)\0" /proc/[0-9]*/environ | grep -oP '\d+'; }

pids_by_window(){ pids_by_env "WINDOWID=$(printf '%d' "$(xwininfo "$@" | awk '/id:/{print$4}')")"; }

$ ps $(pids_by_window)
[click!]
  PID TTY      STAT   TIME COMMAND
11244 pts/8    Ss     0:00 bash
11297 pts/8    S+     0:00 vu [censored].pdf

おすすめ記事