私は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スクリプトはクリーンアップルーチンを実行する機会を取得しません。$pid2
foo.py
kill -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