ループごとに次のデータ収集スクリプトを実行したいと思います。
新しい端末を開いて、ロボットシミュレーションプロセスを実行します
親端末で別のprocess2を実行します
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台)、上記のスクリプトを実行してみました。結果は次のとおりです。
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)。
ターミナルを閉じるのではなく、ターミナル内で実行中のプロセスを何らかの方法で終了(たとえば、強制終了)することをお勧めします。これらは、自分で起動したロボットシミュレーションプロセスであるため、それらに属するPIDを知っておく必要があります。
すべてのターミナルエミュレータのデフォルトを指定すると、要求されたプロセス(つまり、./robot_sim
)が終了すると、これらのターミナルウィンドウまたはタブが閉じます。