web-dev-qa-db-ja.com

子ターミナルを追跡して閉じます。予備の親

ループごとに次のデータ収集スクリプトを実行したいと思います。

  1. 新しい端末を開いて、ロボットシミュレーションプロセスを実行します

  2. 親端末で別のprocess2を実行します

  3. process2が終了したら、ステップ1で開いたすべてのシミュレーター端末を閉じます

ここでは、端末の閉鎖に関する他の多くのQ&Aを読みました。私が苦労しているのは、親プロセスを常に実行して、親端末を開いたままにしておきたいということです。理想的には、スクリプトを開いた各子端末を追跡できるようにして、後で閉じることを選択できるようにします。ただし、現在のスクリプトの子であるかどうかを確認せずに、他のすべてのターミナルを閉じるだけで生活できます。

各端末の識別方法に関する知識は非常に限られています。各プロセスには1つのプロセスIDがありますが、ターミナルはどうですか?プロセスとはいつ、どのように違いますか(端末/プロセスIDの混乱について混乱を招く以下の例を参照してください)。

他の関連するQ&Aからの回答を使用して、以下のスクリプトを作成してみました。

parent_terminal=$(xdotool getactivewindow)
echo "parent_terminal: $parent_terminal"

# TODO: start external loop

    # open a child terminal(s) and run robot_sim there
    #(gnome-terminal -e './robot_sim') 
    #echo $! --> gives blank.. 

    #./process2
    #echo "process2 done. Killing robot_sim.."

    # Kill all other terminals except this one (the parent)
    xdotool search --class "terminal" | while read id
    do
          if [ "$id" -eq "$parent_terminal" ]; then
            echo "This is parent_terminal $parent_terminal"
            echo "Do not kill $id"
            continue
          else
            echo "This is NOT parent_terminal $parent_terminal"
            echo "Killing $id"
            xdotool windowactivate "$id" &>/dev/null # Make the terminal with $id active
            xdotool key ctrl+shift+q # Kill terminal by simulating a key press
            #sleep 0.2
          fi
    done 

# done external loop

最初に現在の端末の横に別の空白の端末を開いて(つまり合計2台)、上記のスクリプトを実行してみました。結果は次のとおりです。

  1. (下の)出力には3つの端末がリストされ、スクリプトは親端末を閉じようとします(強制終了を確認するポップアップウィンドウを表示します)。なぜ2つの端末ではなく3つの端末をリストするのですか?親端末は2つの異なるIDを提供するようです。これらのIDは何ですか?
  2. 半分の時間で他の空白の端末が正常に閉じられますが、時には他の端末を強制終了することさえありません(出力に基づいて、リストされた3つの端末のうち2つを強制終了しようとしました)。
parent_terminal: 62914571 
This is NOT parent_terminal 62914571 
Killing 62914561 
This is NOT parent_terminal 62914571 
Killing 62920887 
This is parent_terminal 62914571 Do not kill 62914571

同様に、1つの(親)ターミナルのみを開いてスクリプトをテストすると、2つのターミナルがリストされ、親を閉じようとします。

parent_terminal: 62914571 
This is NOT parent_terminal 62914571 
Killing 62914561 
This is parent_terminal 62914571 
Do not kill 62914571

追加:このQ&Aも確認しました: 特定の端末を閉じる 、手動で開いたいくつかの端末で以下のコマンドを実行してみました。

$ cat /proc/$$/status | grep PPid

ただし、すべての端末に同じIDが与えられます(PPid:2298)。

5
Vicon

ターミナルを閉じるのではなく、ターミナル内で実行中のプロセスを何らかの方法で終了(たとえば、強制終了)することをお勧めします。これらは、自分で起動したロボットシミュレーションプロセスであるため、それらに属するPIDを知っておく必要があります。

すべてのターミナルエミュレータのデフォルトを指定すると、要求されたプロセス(つまり、./robot_sim)が終了すると、これらのターミナルウィンドウまたはタブが閉じます。

2
egmont